Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
利伯顿;信号处理(特别是SIGCHLD)_C_Libevent - Fatal编程技术网

利伯顿;信号处理(特别是SIGCHLD)

利伯顿;信号处理(特别是SIGCHLD),c,libevent,C,Libevent,这是我发现的相关问题的后续部分 . 在链接的问题中提到了使用signalfd(),并将该fd与一起使用。在这个问题中,OP没有列出他为什么使用signalfd(),而不是libevent信号处理工具 在这两种方法中,您将在信号处理程序之外处理回调 似乎对信号事件回调中的计划计时器发出警告。这似乎不正确(因为我们不在信号处理程序上下文中)。除了上述警告,我看不出使用signalfd()这样做有什么好处 关于两种方法之间的差异或警告的任何输入 谢谢 来自libevent的源代码(v2.0.19-

这是我发现的相关问题的后续部分 .

在链接的问题中提到了使用
signalfd()
,并将该fd与一起使用。在这个问题中,OP没有列出他为什么使用
signalfd()
,而不是libevent信号处理工具

在这两种方法中,您将在信号处理程序之外处理回调

似乎对信号事件回调中的计划计时器发出警告。这似乎不正确(因为我们不在信号处理程序上下文中)。除了上述警告,我看不出使用
signalfd()
这样做有什么好处

关于两种方法之间的差异或警告的任何输入


谢谢

来自libevent的源代码(v2.0.19-stable)

/*信号c

这是我们用于后端的信号处理实现 没有更好的方法来处理信号。它使用sigaction() 或signal()来设置一个信号处理程序,以及一个套接字对来告诉 事件库

注意,我说的是“事件库”:只能设置一个事件库 一次最多使用这个。由于历史原因和落后 兼容性,如果将信号的事件添加到事件库a, 然后将一个信号(任意信号!)的事件添加到事件_base B中, 事件库B将获得信号通知,但事件库A 不会的

在未来版本的 Libevent。kqueue已经做了更明智的事情我们可以 让Linux上的所有后端使用signalfd做合理的事情。 */

所以现在libevent使用sigaction()(如果可用),如果不可用,则使用signal()

如果使用signalfd(),通常会使用sigprocmask阻止信号,以便这些信号不会导致执行默认处理程序。然后,您可以使用libevent监视返回的文件句柄,并安全地处理来自正常同步代码的信号,而不必担心内存安全或阻塞或中断其他系统调用

在经典异步信号处理程序(即使用sigaction注册的处理程序)中,您可以安全地执行的操作受到限制。参见man信号中的“异步信号安全功能”。使用signalfd方法,这些限制大大减少

关于注册计时器回调的警告可能是出于担忧,因为libevent支持如此多的平台,并且至少有一个人报告了问题。请注意,如果选择/轮询signalfd注册的文件句柄,则无论如何都不必担心此限制

编辑:我重新阅读了你的问题,意识到我没有正确地回答。注册signalfd然后在libevent中使用它的好处是,它的速度更快,但以牺牲可移植性为代价。有计划(http://archives.seul.org/libevent/users/Mar-2010/msg00046.html)将signalfd包含到libevent中,但恐怕还没有发生


此外,一旦收到SIGCHLD的通知,您应该始终在循环中调用waitpid,直到得到ENOCHLD,因为这两种方法都会使信号多次出现崩溃。

使用signalfd()的好处您可以读取signalfd_siginfo结构并获取大量有关信号的有用信息。缺点是,如果在您读取signalfd之前退出多个子项,它们将被压缩为一个子项。所以其他孩子的信息会丢失。您仍然可以通过WIFEXITED宏等获取一些信息……完全同意/理解collapse/
waitpid
循环,单个事件库可以接收信号事件,从而受益于
signalfd
。但我仍然认为,如果存在无法在dispatcher循环中运行信号事件和/或无法安排/添加其他事件的平台和环境,则应在这些平台上禁用信号事件(您能告诉我不喜欢警告吗?:))。谢谢