【问题标题】:Pending signals not being delivered未传递的未决信号
【发布时间】:2014-11-13 07:20:14
【问题描述】:

我编写了这个程序来检查 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。

这可能是什么问题?

PS 我正在使用 CentOs

这是处理函数

void sig_quit(int i)
{
     printf("\nSIGQUIT caught\n");
     fflush(stdout);
     signal(SIGQUIT,SIG_DFL);
}

【问题讨论】:

    标签: linux centos signals signal-handling


    【解决方案1】:

    那是因为当您认为自己是时,您并没有解除对SIGQUIT 的阻止:

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

    使用SIG_BLOCKsigprocmaskoldmask 添加到当前阻塞的信号中。

    试试吧:

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

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

    【讨论】:

    • 谢谢!我忽略了那句话!
    猜你喜欢
    • 2020-09-30
    • 1970-01-01
    • 2016-08-09
    • 2013-02-12
    • 2016-06-14
    • 1970-01-01
    • 2017-10-11
    • 2018-10-16
    • 1970-01-01
    相关资源
    最近更新 更多