system.c 1.0 KB

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