#include #include #include #include #include void pr_mask(const char *str) { sigset_t sigset; int errno_save; errno_save = errno; if (sigprocmask(0, NULL, &sigset) < 0) { fprintf(stderr, "sigprocmask error\n"); exit(1); } printf("%s", str); if (sigismember(&sigset, SIGINT)) printf("SIGINT "); if (sigismember(&sigset, SIGQUIT)) printf("SIGQUIT "); if (sigismember(&sigset, SIGUSR1)) printf("SIGUSR1 "); if (sigismember(&sigset, SIGALRM)) printf("SIGALRM "); printf("\n"); errno = errno_save; } static void sig_quit(int signo) { printf("caught SIGQUIT\n"); if (signal(SIGQUIT, SIG_DFL) == SIG_ERR) { fprintf(stderr, "can't reset SIGQUIT\n"); exit(1); } } int main() { sigset_t newmask, oldmask, pendmask; if(signal(SIGQUIT, sig_quit) == SIG_ERR) { fprintf(stderr, "can't set signal handler\n"); exit(1); } sigemptyset(&newmask); sigaddset(&newmask, SIGQUIT); if (sigprocmask(SIG_BLOCK, &newmask, &oldmask) < 0) { fprintf(stderr, "SIG_BLOCK error\n"); exit(1); } sleep(5); if (sigpending(&pendmask) < 0) { fprintf(stderr, "sigpending error\n"); exit(1); } if (sigismember(&pendmask, SIGQUIT) < 0) { fprintf(stderr, "sigismember error\n"); exit(1); } if (sigprocmask(SIG_SETMASK, &oldmask, NULL) < 0) { fprintf(stderr, "SIG_SETMASK error\n"); exit(1); } printf("SIGQUIT unblocked\n"); sleep(5); exit(0); }