The GNU C Library - Testing for Delivery

Node: Testing for Delivery Next: Blocking for Handler Prev: Process Signal Mask Up: Blocking Signals

Blocking to Test for Delivery of a Signal

Now for a simple example. Suppose you establish a handler for SIGALRM signals that sets a flag whenever a signal arrives, and your main program checks this flag from time to time and then resets it. You can prevent additional SIGALRM signals from arriving in the meantime by wrapping the critical part of the code with calls to sigprocmask , like this:

	/* This variable is set by the SIGALRM signal handler. */
	volatile sig_atomic_t flag = 0;
	
	int
	main (void)
	{
	  sigset_t block_alarm;
	
	  ...
	
	  /* Initialize the signal mask. */
	  sigemptyset (&block_alarm);
	  sigaddset (&block_alarm, SIGALRM);
	
	  while (1)
	    {
	      /* Check if a signal has arrived; if so, reset the flag. */
	      sigprocmask (SIG_BLOCK, &block_alarm, NULL);
	      if (flag)
	        {
	          actions-if-not-arrived
	          flag = 0;
	        }
	      sigprocmask (SIG_UNBLOCK, &block_alarm, NULL);
	
	      ...
	    }
	}


Next: Blocking for Handler Up: Blocking Signals