#include <stdio.h>
#include <stdlib.h>
#include <bits/sigset.h>
#include <signal.h>
#include <errno.h>
void pr_mask(char *str)
{
sigset_t sigset01;
int errno_save;
errno_save=errno;
if(sigprocmask(0,NULL,&sigset01)==-1)
perror("provmask");
printf("%s\n",str);
if(sigismember(&sigset01,SIGINT))
printf("SIGINT\n");
if(sigismember(&sigset01,SIGUSR1))
printf("SIGUSR1\n");
if(sigismember(&sigset01,SIGQUIT))
printf("SIGQUIT\n");
if(sigismember(&sigset01,SIGALRM))
printf("SIGALRM\n");
errno=errno_save;
}
void sig_int(int sig)
{
printf("signo is %d\n",sig);
pr_mask("\ntest:in sig_int\n");
}
int main()
{
sigset_t oldmask,newmask,waitmask;
printf("mypid is :%d\n",getpid());
pr_mask("program start");
if(signal(SIGINT,sig_int)==SIG_ERR)
{
perror("signal");
exit(1);
}
if(signal(SIGUSR1,sig_int)==SIG_ERR)
{
perror("signal2");
exit(1);
}
sigemptyset(&waitmask);
sigemptyset(&newmask);
sigaddset(&waitmask,SIGUSR1);
sigaddset(&newmask,SIGINT);
sigaddset(&newmask,SIGUSR1);
if(sigprocmask(SIG_BLOCK,&newmask,&oldmask)==-1)//SIGINT
perror("promask");
pr_mask("in the critical region");
if(sigsuspend(&waitmask)!=-1)//SIGUSR1
perror("sigsuspend");
pr_mask("after return from sigsuspend");
if(sigprocmask(SIG_SETMASK,&oldmask,NULL)==-1)
perror("sigprocmask");
pr_mask("\nprogram exit()\n");
return 0;
}