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