Jan*_*cke 9 linux posix signals
为某个信号指定处理程序的经典方法是via sigaction.Linux还提供了signalfd功能,我们可以将信号连接到文件描述符,然后将select /(e)poll应用于该描述符,这完全符合许多事件循环驱动系统的概念.
我想知道当两种机制发生碰撞时会发生什么/应该发生什么.有竞争条件吗?在signalfd联机帮助页(http://man7.org/linux/man-pages/man2/signalfd.2.html)上,我们读到:
通常,应使用sigprocmask(2)阻止通过文件描述符接收的信号集,以防止根据其默认处置来处理信号.
因此,它说"通常"我们使用信号掩码以防止(默认)处理程序处理信号.它并没有说我们必须在连接文件描述符时阻止该信号.不幸的是,手册页没有说明当我们不阻止信号时会发生什么.
这看起来像定义不明确的行为.我不相信这实际上没有明确定义,我想知道这里是否有人知道我是否可以找到关于系统应该如何表现的详细规范或ii)它的行为方式.
我特别感兴趣的是这个执行顺序:
这是未定义的行为还是存在必须发生的标准/规范?处理程序是否始终优先于文件描述符?是否调用了处理程序并且文件描述符触发了事件?设置是否sigaction更改信号掩码,不需要渲染步骤(2)?
我可以尝试从涉及实际代码的系统测试中推导出实际行为.但是,我当然更愿意找到一份详细的文档,并认为我自己找不到合适的参考资料.
Dam*_*mon 12
signalfdsigwaitinfo除了您通过文件描述符访问信息之外,其行为完全相同.这意味着a 同步signalfd接收信号,并且首先调用信号处理程序(或默认处置中的任何一个).
资料来源: TLPI第22.10和22.11章(M. Kerrisk).
行为是明确定义的,但不一定是人们所期望的,并且手册的措辞相当糟糕.说"通常......应该"表示要么你不是真的必须,要么更糟糕的是作者不太确定.
如果你希望它"正常"工作,即你通常期望的方式(参见,我通常也使用"),你必须阻止信号.否则,信号将通过文件描述符提供,但仍将首先调用处理程序(这是完全合法的,但大多数人可能会认为这是"奇怪的行为").
因此,存在两种不同的竞争条件.一个条件是你问的问题,但是虽然行为有点出乎意料,但它是明确定义的并且(有点)记录,如果你考虑它,那么它不是严格意义上的竞争条件.相反,它是一种"双重交付".
另一种竞争条件是在您创建信号之后signalfd但在阻止信号之前信号到达的可能性.这是不太可能的,但原则上,这可能发生.幸运的是,解决方案很容易,你可以阻止信号第一,然后创建该文件描述符(随后将马上准备好,如果一个信号之间的到达).
您命名的命令序列(创建文件描述符,取消阻止,然后sigaction)具有类似的竞争条件.您应首先安装一个处理程序然后取消阻止,或者可以在处理程序存在之前传递信号.但这与此无关signalfd.在任何情况下,文件描述符仍然可以用于读取信号,但是如果信号在解锁和安装处理程序之间到达,则默认处置可能会终止进程.
| 归档时间: |
|
| 查看次数: |
964 次 |
| 最近记录: |