#include <stdio.h> #include <string.h> #include <signal.h> #include <stdlib.h> #include <unistd.h> #include <err.h> void sigprint(const char *msg, const sigset_t *ss) { printf("%s:", msg); for (size_t i = 1; i < NSIG; i++) if (sigismember(ss, i)) printf(" %s", strsignal(i)); printf("\n"); } int main(void) { sigset_t ss, si; sigemptyset(&ss); sigprocmask(SIG_SETMASK, NULL, &ss); sigprint("blocked", &ss); sigemptyset(&ss); sigemptyset(&si); printf("NSIG=%d\n", NSIG); for (size_t i = 1; i < NSIG; i++) { struct sigaction sa; if (sigaction(i, NULL, &sa) == -1) { warn("sigaction %zu", i); continue; } switch ((intptr_t)sa.sa_handler) { case (intptr_t)SIG_DFL: break; case (intptr_t)SIG_IGN: sigaddset(&si, i); break; case (intptr_t)SIG_ERR: errx(EXIT_FAILURE, "sigaction SIG_ERR %zu", i); case (intptr_t)SIG_HOLD: errx(EXIT_FAILURE, "sigaction SIG_HOLD %zu", i); default: sigaddset(&ss, i); } } sigprint("ignored", &si); sigprint("caught", &ss); for (;;) continue; return 0; }