tellwait.c 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. #include <signal.h>
  2. #include "ourhdr.h"
  3. static volatile sig_atomic_t sigflag;
  4. /* set nonzero by signal handler */
  5. static sigset_t newmask, oldmask, zeromask;
  6. static void
  7. sig_usr(int signo) /* one signal handler for SIGUSR1 and SIGUSR2 */
  8. {
  9. sigflag = 1;
  10. return;
  11. }
  12. void
  13. TELL_WAIT()
  14. {
  15. if (signal(SIGUSR1, sig_usr) == SIG_ERR)
  16. err_sys("signal(SIGINT) error");
  17. if (signal(SIGUSR2, sig_usr) == SIG_ERR)
  18. err_sys("signal(SIGQUIT) error");
  19. sigemptyset(&zeromask);
  20. sigemptyset(&newmask);
  21. sigaddset(&newmask, SIGUSR1);
  22. sigaddset(&newmask, SIGUSR2);
  23. /* block SIGUSR1 and SIGUSR2, and save current signal mask */
  24. if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0)
  25. err_sys("SIG_BLOCK error");
  26. }
  27. void
  28. TELL_PARENT(pid_t pid)
  29. {
  30. kill(pid, SIGUSR2); /* tell parent we're done */
  31. }
  32. void
  33. WAIT_PARENT(void)
  34. {
  35. while (sigflag == 0)
  36. sigsuspend(&zeromask); /* and wait for parent */
  37. sigflag = 0;
  38. /* reset signal mask to original value */
  39. if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)
  40. err_sys("SIG_SETMASK error");
  41. }
  42. void
  43. TELL_CHILD(pid_t pid)
  44. {
  45. kill(pid, SIGUSR1); /* tell child we're done */
  46. }
  47. void
  48. WAIT_CHILD(void)
  49. {
  50. while (sigflag == 0)
  51. sigsuspend(&zeromask); /* and wait for child */
  52. sigflag = 0;
  53. /* reset signal mask to original value */
  54. if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0)
  55. err_sys("SIG_SETMASK error");
  56. }