#include <apue.h>
#include <errno.h>
/**
* 1 保护代码临界区 使其不被特定信号中断
* 2 当sigsuspend返回时 它将信号屏蔽字设置为调用它之前当值
* SIGINT信号将被阻塞。因此将信号屏蔽恢复为之前保存当值oldmask
* 3 在调用sigsuspend时 将SIGUSR1信号加到了进程号屏蔽字中,
* 所以当运行该信号处理程序时,得知信号屏蔽字已改变。可见,在
* sigsuspend返回时,它将信号屏蔽字恢复为调用它之前当值
*/
static void sig_int(int);
void pr_mask(const char *);
int main(void)
{
sigset_t newmask,oldmask,waitmask;
pr_mask("program start: ");
if(signal(SIGINT,sig_int) == SIG_ERR)
err_sys("signal(SIGINT) error!");
sigemptyset(&waitmask);
sigaddset(&waitmask,SIGUSR1);
sigemptyset(&newmask);
sigaddset(&newmask,SIGINT);
/**
* Block SIGINT and save current signal mask
*/
if(sigprocmask(SIG_BLOCK,&newmask,&oldmask) < 0)
err_sys("SIG_BLOCK error");
/**
* Critical region of code
*/
pr_mask("in critical region: ");
/**
* Pause, allowing all signals except SIGUSR1
*/
if(sigsuspend(&waitmask) != -1)
err_sys("sigsuspend error");
pr_mask("after return from sigsuspend: ");
/**
* Reset signal mask which unblocks SIGINT
*/
if(sigprocmask(SIG_SETMASK,&oldmask,NULL) < 0)
err_sys("SIG_SETMASK error");
/**
* And continue processing ...
*/
pr_mask("program exit: ");
exit(0);
}
static void sig_int(int signo)
{
pr_mask("\nin sig_int: ");
}
void pr_mask(const char *str)
{
sigset_t sigset;
int errno_save;
errno_save = errno;
if(sigprocmask(0,NULL,&sigset) < 0){
err_ret("sigprocmask error!");
}else{
printf("%s",str);
if(sigismember(&sigset,SIGINT))
printf(" SIGINT");
if(sigismember(&sigset,SIGQUIT))
printf(" SIGQUIT");
if(sigismember(&sigset,SIGUSR1))
printf(" SIGUSR1");
if(sigismember(&sigset,SIGALRM))
printf(" SIGALRM");
/* REMAINING SIGNALS CAN GO HERR */
printf("\n");
}
errno = errno_save; /* restore errno */
}
学无止境不耻下问:http://includestdio.com