/* Disable ^C in critical region. */ /* Show how to test if ^C pending. */ #include #include void fatal(void) { /* signal error */ exit(21); } int main() { sigset_t sset,oldsset,pendingset; sigemptyset(&sset); /* better: sigprocmask(SIG_BLOCK,NULL,&sset); */ sigaddset(&sset,SIGINT); if (-1 == sigprocmask(SIG_BLOCK,&sset,&oldsset)) fatal(); /* signal now blocked */ printf("Entering critical region (sleep 5 seconds)\n"); sleep(5); sigpending(&pendingset); /* test if signal is pending */ if (sigismember(&pendingset,SIGINT)) printf("SIGINT pending\n"); printf("Leaving critical region\n"); /* restore previous set */ if (-1 == sigprocmask(SIG_SETMASK,&oldsset,NULL)) fatal(); /* WRONG: sigprocmask(SIG_UNBLOCK,&sset,NULL); [Shouldn't unblock SIGINT if it was initially blocked] */ printf("Bye - you never pressed ^C\n"); return 0; }