【发布时间】:2013-11-26 21:14:05
【问题描述】:
为某个信号指定处理程序的经典方法是通过sigaction。 Linux 还提供了signalfd 功能,我们可以将信号连接到文件描述符,然后将 select/(e)poll 应用于该描述符,这完全符合许多事件循环驱动系统的概念。
我想知道当两种机制发生冲突时会发生什么/应该发生什么。可以有比赛条件吗?在 signalfd 手册页 (http://man7.org/linux/man-pages/man2/signalfd.2.html) 上,我们读到:
通常,通过文件描述符接收的一组信号 应该使用 sigprocmask(2) 来阻止信号,以防止信号被 根据他们的默认处置进行处理。
因此,它说“通常”我们使用信号掩码来防止(默认)处理程序处理信号。它并不是说当我们有一个文件描述符连接到它时我们必须阻止该信号。不幸的是,手册页没有说明当我们不阻塞信号时会发生什么。
这看起来像是定义不明确的行为。我不相信这实际上没有明确定义,我想知道这里是否有人知道i)我是否可以找到有关系统应如何运行的详细规范或ii ) 它的行为方式。
我特别感兴趣的是这个执行顺序:
- 针对某个信号的signalfd,包括对该信号的阻塞
- 此信号解除阻塞
- 此信号的sigaction(默认处理程序或自定义处理程序)
这是未定义的行为,还是有必须发生的标准/规范?处理程序是否总是优先于文件描述符?处理程序是否称为 并且 文件描述符会触发事件?设置sigaction是否会改变信号掩码,不需要渲染步骤(2)?
我可以尝试从涉及实际代码的系统测试中推导出实际行为。但是,我当然更喜欢查找详细的文档,并认为我自己无法找到正确的参考资料。
【问题讨论】:
-
这似乎归结为上述描述中使用normally是否合理的问题。忽略没有什么停止任何人不首先阻止信号的问题,实际上是否有一个用例不在使用
signalfd或sigwaitinfo之前阻止信号?在我看来,这些调用的全部意义在于对 pending 信号进行操作以规避它们的交付处置。因此,我将把它放在那里:有谁知道畅通的信号和这些调用中的任何一个都有意义的情况?