我写了这个程序来检查SIGQUIT信号的阻塞。问题是在恢复到之前的状态后,信号正在等待但是没有交付。
这是主程序
sigset_t newmask, oldmask, pendmask;
if(signal(SIGQUIT,sig_quit)==SIG_ERR) //Register signal handler
printf("\nerror\n");
sigemptyset(&newmask);
sigaddset(&newmask,SIGQUIT);
sigprocmask(SIG_BLOCK,&newmask,&oldmask); //Save previous value and block SIGQUIT
sleep(5);
sigpending(&pendmask);
if(sigismember(&pendmask,SIGQUIT)){ //Check if SIGQUIT is pending
printf("\nSIGQUIT pending..\n");
fflush(stdout);
}
sigprocmask(SIG_BLOCK,&oldmask,NULL); //Restore old value of sigset
printf("\nSIGQUIT unblocked\n");
fflush(stdout);
sleep(5); //Sleep again to check if everything is A-okay!
我可以理解,在第一次睡眠中,信号被阻挡了。但即使在解锁后,在第二个睡眠功能中,程序也没有响应SIGQUIT。
这可能是什么问题?
P.S我使用CentOs
这里是处理函数
void sig_quit(int i)
{
printf("\nSIGQUIT caught\n");
fflush(stdout);
signal(SIGQUIT,SIG_DFL);
}
答案 0 :(得分:1)
那是因为你认为自己没有取消阻止SIGQUIT
:
sigprocmask(SIG_BLOCK,&oldmask,NULL); //Restore old value of sigset
使用SIG_BLOCK
,sigprocmask
正在向当前阻止的信号添加oldmask
。
尝试改为:
sigprocmask(SIG_SETMASK,&oldmask,NULL); //Restore old value of sigset
此外,在sig_quit
中您使用的printf
不是async-signal-safe函数。例如,您可以使用write
代替。