#include #include #include #include #include #define handle_error(msg) \ do { perror(msg); exit(EXIT_FAILURE); } while (0) /* Code taken from signalfd(2) man page and slightly modified. */ int main(int argc, char *argv[]) { sigset_t mask; int sfd; struct signalfd_siginfo fdsi; ssize_t s; sigemptyset(&mask); sigaddset(&mask, SIGINT); sigaddset(&mask, SIGQUIT); sigaddset(&mask, SIGPIPE); sigaddset(&mask, SIGSYS); sigaddset(&mask, SIGIO); sigaddset(&mask, SIGURG); sigaddset(&mask, SIGTERM); sigaddset(&mask, SIGUSR1); sigaddset(&mask, SIGUSR2); /* Block signals so that they aren't handled according to their default dispositions */ if (sigprocmask(SIG_BLOCK, &mask, NULL) == -1) handle_error("sigprocmask"); sfd = signalfd(-1, &mask, 0); if (sfd == -1) handle_error("signalfd"); for (;;) { s = read(sfd, &fdsi, sizeof(struct signalfd_siginfo)); if (s != sizeof(struct signalfd_siginfo)) handle_error("read"); switch(fdsi.ssi_signo) { case SIGINT: printf("Got SIGINT\n"); break; case SIGQUIT: printf("Got SIGQUIT\n"); break; case SIGPIPE: printf("Got SIGPIPE\n"); break; case SIGSYS: printf("Got SIGSYS\n"); break; case SIGIO: printf("Got SIGIO\n"); break; case SIGURG: printf("Got SIGURG\n"); break; case SIGTERM: printf("Got SIGTERM\n"); break; case SIGUSR1: printf("Got SIGUSR1\n"); break; case SIGUSR2: printf("Got SIGUSR2\n"); break; default: printf("Got unexpected signal!?\n"); break; } } }