挂起的信号未送达

时间:2014-11-13 07:20:15

标签: linux centos signals signal-handling

我写了这个程序来检查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);
}

1 个答案:

答案 0 :(得分:1)

那是因为你认为自己没有取消阻止SIGQUIT

sigprocmask(SIG_BLOCK,&oldmask,NULL);   //Restore old value of sigset

使用SIG_BLOCKsigprocmask正在向当前阻止的信号添加oldmask

尝试改为:

sigprocmask(SIG_SETMASK,&oldmask,NULL);   //Restore old value of sigset

此外,在sig_quit中您使用的printf不是async-signal-safe函数。例如,您可以使用write代替。