sigwaitinfo()可以等待超级进程信号掩码吗?

我正准备为Jehanne正确模拟sigwait(),sigwaitinfo()和sigtimedwait(),但是当set参数选择的多个信号同时发送到等待其中一个函数的进程时,我无法理解预期的行为。

例如,第一个信号将导致sigwaitinfo返回,填充info参数。 但第二个信号呢? 就我所见,如果第二个信号没有被阻塞(它不包含在过程信号掩码中),那么过程应该接收它,中断第一个信号管理,减少使用这些功能组的优势。

这让我想知道提供给这些函数的set是否必须始终是过程信号掩码的一个子集,或者是否有其他简单的东西丢失。

换句话说:Linux手册页说明了这一点

正常使用情况下 ,调用程序通过先前调用sigprocmask(2)来阻塞set中的信号(这样,如果在连续调用sigwaitinfo()或sigtimedwait())之间变为挂起,则不会发生这些信号的默认处置,不建立这些信号的处理程序。

我想知道这个“正常用法”是这个API的唯一正确用法,或者有适当的用例,其中set参数比进程信号掩码包含更多的信号。


这个小代码是试图回答你的评论,并且似乎在Ubuntu上按预期工作

// ctrl-c handler
void cc(int s) {
    static int count = 0;
    printf("Entering cc %dn", ++count);
    sleep (5);
    printf("Leaving cc %dn", count);
}

int main(int argc, char **argv) {
    signal(SIGINT, cc); // ctrl-c

    int n = 10; // leave after 10 ctrl-c
    while (n--) {
        pause();
    }
    return 0;
}

Ctrl-C被捕获并且cc被执行。 cc递增并打印一个数字,我们希望离开该功能时显示相同的数字。 如果cc在执行完成(第5次睡眠)之前由于另一个Ctrl-C重新输入,我们会有类似的东西

Entered cc 1
Entered cc 2
Leaving cc 2
Leaving cc 2

不建议在信号处理程序中执行一些类似于printf I / O操作,但在我们的小案例中不存在共享冲突,即使我们有一些stdout缓冲区,“离开文本”最终将与上面类似,如果cc重新进入。

但是那没有发生。 在cc正在休眠时按下另一个Ctrl-C似乎有第二个事件悬而未决(只有1个事件似乎被保留)。 sleep()可能会有特殊的行为? 在那种情况下,无论如何, cc会在睡眠之后重新进入,并在上面显示不需要的行为。

另一个值得注意的行为是在main中pause() 。 如果另一个Ctrl-C在“睡眠”时被按下,则第二个在同一个“暂停”(类似while(event) { process(event); } ;内执行;这种行为由Ctrl- C必须做的离开程序:应该是10,但它实际上是10 +键的次数被按下,而前一个正在处理的次数。

但是,不确定它适用于您的系统和任何事件。


我想这取决于你的意思是“正确的”。

正常使用是唯一明智的用法。

异常使用是允许的,因为它不会限制未定义的行为。 它也毫无意义,危险地复杂。 您的实施将有一定的算法派遣2个未决的信号,这是一个过程sigwait荷兰国际集团两者SIG_IGNoring没有,最多一个阻挡。*这是值得怀疑的过程已正确设计,但是。

*根据POSIX-1.2008的“信号概念”,假设非实时信号,“多个同时待处理的信号被传送到或被处理接受的顺序未指定”。

链接地址: http://www.djcxy.com/p/50031.html

上一篇: Can sigwaitinfo() wait for a super set of the process signal mask?

下一篇: C Signal usage and process using IPC message queues