sigaction, signal sets, sigprocmask

Script started on Wed Apr 30 12:22:48 1997
sh-2.00$ cat tryhold2.c

/* tryhold2.c */
/* Demonstrate sigaction, signal sets, sigprocmask. */
/* Block SIGUSR1 until we get a SIGUSR2. */

#include <signal.h>
#include <stdio.h>

void handle1(int);
void handle2(int);

sigset_t set;

int main()
{
	struct sigaction action;

	
	/* Set up signal set with just SIGUSR1. */
	sigemptyset(&set);
	sigaddset(&set, SIGUSR1);

	/* Trap SIGUSR1. */
	/* Set up mask in sigaction structure - no mask. */
	sigemptyset(&action.sa_mask);
	/* No flags needed here. */
	action.sa_flags = 0;
	action.sa_handler = handle1;
	sigaction(SIGUSR1, &action, NULL);
        
	/* Trap SIGUSR2 - just change handler in action. */
	action.sa_handler = handle2;
	sigaction(SIGUSR2, &action, NULL);

	/* Block SIGUSR1 */
	sigprocmask(SIG_BLOCK, &set, NULL);

	/* Just wait around for signals. */
	/* We will get a USR2 first because USR1 is blocked. 
	   Unblock USR1 here. */
	while(1)
	{
		pause();
		sigprocmask(SIG_UNBLOCK, &set, NULL);
	}
	
}

void handle1(int sig)
{
	printf("Got a SIGUSR1 signal\n");
}

void handle2(int sig)
{
	printf("Got a SIGUSR2 signal\n");
	/* Formerly sigrelse(SIGUSR1); was here.*/
}

sh-2.00$ tryhold2

sh-2.00$ tryhold2 &
[1] 19688
sh-2.00$ kill -SIGUSR1 19688
sh-2.00$ kill -SIGUSR1 19688
sh-2.00$ kill -SIGUSR2 19688
Got a SIGUSR2 signal
Got a SIGUSR1 signal
sh-2.00$ kill -SIGUSR2 19688
Got a SIGUSR2 signal
sh-2.00$ exit
exit

script done on Wed Apr 30 12:24:13 1997