system.c 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. #include <stddef.h>
  2. #include <signal.h>
  3. #include <unistd.h>
  4. int
  5. system(command)
  6. char * command;
  7. {
  8. int wait_val, wait_ret, pid;
  9. __sighandler_t save_quit, save_int, save_chld;
  10. if( command == 0 ) return 1;
  11. save_quit = signal(SIGQUIT, SIG_IGN);
  12. save_int = signal(SIGINT, SIG_IGN);
  13. save_chld = signal(SIGCHLD, SIG_DFL);
  14. if( (pid=vfork()) < 0 )
  15. {
  16. signal(SIGQUIT, save_quit);
  17. signal(SIGINT, save_int);
  18. signal(SIGCHLD, save_chld);
  19. return -1;
  20. }
  21. if( pid == 0 )
  22. {
  23. signal(SIGQUIT, SIG_DFL);
  24. signal(SIGINT, SIG_DFL);
  25. signal(SIGCHLD, SIG_DFL);
  26. execl("/bin/sh", "sh", "-c", command, (char*)0);
  27. _exit(127);
  28. }
  29. /* Signals are not absolutly guarenteed with vfork */
  30. signal(SIGQUIT, SIG_IGN);
  31. signal(SIGINT, SIG_IGN);
  32. printf("Waiting for child %d\n", pid);
  33. if (wait4(pid, &wait_val, 0, 0) == -1)
  34. wait_val = -1;
  35. signal(SIGQUIT, save_quit);
  36. signal(SIGINT, save_int);
  37. signal(SIGCHLD, save_chld);
  38. return wait_val;
  39. }