这是一个后续相关的问题,我发现有点的位置 。
在链接的问题有使用的一提signalfd()
并使用与FD 的libevent 。 在这个问题他为什么使用OP不会列出signalfd()
而不是在libevent的信号处理设施。
在这两种方法中,您将处理信号处理程序之外的回调。
本文档似乎警告的信号事件回调调度计时器。 这看起来不正确(如我们将是一个信号处理程序上下文之外)。 除了用于表示警告我不能看到一个好处与这样signalfd()
关于这两种方法之间或约警告所作的任何输入
谢谢!
从libevent的源代码(v2.0.19稳定)
/ * signal.c
这是信号处理实现,我们使用的是没有更好的办法来做到的信号处理后端。 它使用的sigaction()或信号()来设置的信号处理程序,一个套接字对告诉事件基时
请注意,我说:“事件基地”:只有一个事件底座可设置在同一时间使用这个。 由于历史的原因和向后兼容性,如果为一个信号event_base一个添加事件,然后添加一个事件的信号(任何信号!),以event_base B,event_base B就得到了解的信号,但event_base A将不。
这将是整齐改变一些未来LIBEVENT版本的这种行为。 kqueue的已经做远一些更明智。 我们可以在Linux上所有的后端做使用signalfd一件合理的事。 * /
所以,现在的libevent使用的sigaction(),如果它是可用的,并且,做不到这一点,信号()。
如果你使用signalfd()你平时使用sigprocmask阻断信号,使信号不会导致默认的处理程序来执行。 然后,你可以使用的libevent监视返回的文件句柄,并处理来自安全正常同步码的信号,而不必担心内存的安全或阻止或中断其他系统调用。
有什么你可以放心地经典异步内部信号处理程序做限制(即那些使用的sigaction注册)。 见男子信号的“异步信号安全功能”。 使用signalfd方法,这些限制也相对减轻。
有关注册计时器回调的警告很可能把那里作为一个问题,因为libevent的支持这么多平台,并至少有一人被报告的问题。 注意,如果你选择/投票通过signalfd注册的文件句柄,那么你就不必担心这个限制反正。
编辑:我重读你的问题,并意识到我真的没有正确地回答了这个问题。 注册signalfd,然后用在了libevent的好处是因为它在便携性为代价的更快。 有计划(http://archives.seul.org/libevent/users/Mar-2010/msg00046.html),包括signalfd到libevent的,但据我所知还没有发生过。
此外,一旦你已经通知了SIGCHLD的你应该总是调用waitpid函数在一个循环,直到你得到ENOCHLD因为这两种方法都会崩溃的信号多次出现。