学习sigprocmask,发现sigpromask有时返回的oset是调用sigprocmask前信号的屏蔽集(截图中的“程序启动时”),有时返回的oset又是调用sigprocmask后信号屏蔽集(截图中的“收到SIGUSR2信号”)。
APUE是如下图说的。到底改如何理解这个oset呢?
程序运行解图:
程序代码:
为了方便各位大神测试,贴出代码:
#include
#include
#include
#include
#include
void printsigset(sigset_t *set) //打印信号集中的各个位
{
int i;
for(i=1;i<NSIG;i++)
{
if(sigismember(set,i)) putchar('1');
else putchar('0');
}
printf("\n");
}
void handle_sigusr2(int sig)
{
sigset_t set,oset; //添加新的阻塞信号SIGUSR2,并打印出当前信号屏蔽字oset
sigemptyset(&set);
sigemptyset(&oset);
sigaddset(&set,SIGUSR2);
sigprocmask(SIG_BLOCK,&set,&oset);
printsigset(&oset);
}
int main(void)
{
signal(SIGUSR2,handle_sigusr2);//添加新的阻塞信号SIGUSR1,并打印出当前信号屏蔽字oset
sigset_t set,oset;
sigemptyset(&set);
sigemptyset(&oset);
sigaddset(&set,SIGUSR1);
sigprocmask(SIG_BLOCK,&set,&oset);
printsigset(&oset);
for(;;) pause();
return 0;
}