| | |
| | | #include "usg_common.h" |
| | | static void sig_quit(int); |
| | | #define SIGCLOSE1 (SIGRTMIN +1) |
| | | int |
| | | main(void) |
| | | { |
| | | sigset_t |
| | | newmask, oldmask, pendmask; |
| | | if (signal(SIGQUIT, sig_quit) == SIG_ERR) |
| | | err_exit(errno, "can’t catch SIGQUIT"); |
| | | /* |
| | | * Block SIGQUIT and save current signal mask. |
| | | */ |
| | | sigemptyset(&newmask); |
| | | sigaddset(&newmask, SIGQUIT); |
| | | if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0) |
| | | err_exit(errno, "SIG_BLOCK error"); |
| | | sleep(5); |
| | | /* SIGQUIT here will remain pending */ |
| | | if (sigpending(&pendmask) < 0) |
| | | err_exit(errno, "sigpending error"); |
| | | if (sigismember(&pendmask, SIGQUIT)) |
| | | printf("\nSIGQUIT pending\n"); |
| | | /* |
| | | * Restore signal mask which unblocks SIGQUIT. |
| | | */ |
| | | if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0) |
| | | err_exit(errno, "SIG_SETMASK error"); |
| | | printf("SIGQUIT unblocked\n"); |
| | | sleep(5); |
| | | exit(0); |
| | | printf("%d, %d , %d\n", SIGRTMIN, SIGRTMAX, SIGCLOSE1); |
| | | /* SIGQUIT here will terminate with core file */ |
| | | } |
| | | |
| | | static void sig_quit(int signo) |
| | | { |
| | | printf("caught SIGQUIT\n"); |
| | | if (signal(SIGQUIT, SIG_DFL) == SIG_ERR) |
| | | err_exit(errno, "can’t reset SIGQUIT"); |
| | | } |
| | | |