/* Disable ^C in critical region.  */
/* Show how to test if ^C pending. */

#include <signal.h>
#include <stdio.h>
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;
   }
