#include <stdio.h> #include <unistd.h> #include <signal.h> #include <stdlib.h> #include <string.h> void divert (int sig) { printf("signal received=%d\n",sig); } int main() { sigset_t mask, pending; if (signal(SIGINT, divert)== SIG_ERR) { perror("signal(SIGINT, divert) failed"); exit(1); } printf("going to sleep for 5 secs, during which Ctrl-C will wake up the process\n"); sleep(5); sigemptyset(&mask); sigaddset(&mask,SIGINT); if(sigprocmask(SIG_BLOCK, &mask, 0) < 0) { perror("sigprocmask"); exit(1); } printf("sleeping again for 5 secs, delaying the response to Ctrl-C\n"); sleep(5); if(sigpending(&pending) <0) { perror("sigpending"); exit(1); } if(sigismember(&pending, SIGINT)) printf("SIGINT pending\n"); if(sigprocmask(SIG_UNBLOCK,&mask,0) < 0) { perror("sigblockmask"); exit(1); } printf("SIGINT unblocked\n"); } /* going to sleep for 5 secs, during which Ctrl-C will wake up the process signal received=2 sleeping again for 5 secs, delaying the response to Ctrl-C SIGINT pending signal received=2 SIGINT unblocked */