sigset.c 627 B

123456789101112131415161718192021222324252627
  1. #include <signal.h>
  2. void (*sigset(int sig, void (*handler)(int)))(int)
  3. {
  4. struct sigaction sa, sa_old;
  5. sigset_t mask;
  6. sigemptyset(&mask);
  7. if (sigaddset(&mask, sig) < 0)
  8. return SIG_ERR;
  9. if (handler == SIG_HOLD) {
  10. if (sigaction(sig, 0, &sa_old) < 0)
  11. return SIG_ERR;
  12. if (sigprocmask(SIG_BLOCK, &mask, &mask) < 0)
  13. return SIG_ERR;
  14. } else {
  15. sa.sa_handler = handler;
  16. sa.sa_flags = 0;
  17. sigemptyset(&sa.sa_mask);
  18. if (sigaction(sig, &sa, &sa_old) < 0)
  19. return SIG_ERR;
  20. if (sigprocmask(SIG_UNBLOCK, &mask, &mask) < 0)
  21. return SIG_ERR;
  22. }
  23. return sigismember(&mask, sig) ? SIG_HOLD : sa_old.sa_handler;
  24. }