Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.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
如果事件处于挂起状态,Linux上的pselect()不会传递信号_C_Unix_Select_Signals - Fatal编程技术网

如果事件处于挂起状态,Linux上的pselect()不会传递信号

如果事件处于挂起状态,Linux上的pselect()不会传递信号,c,unix,select,signals,C,Unix,Select,Signals,我正在尝试添加一个信号处理程序,以便对我的事件驱动应用程序进行适当的清理 我的SIGINT信号处理程序只更改全局标志变量的值,然后在主循环中检查该变量。为避免比赛,除pselect呼叫期间外,信号始终被阻止。这将导致仅在pselect调用期间发送挂起的信号,pselect调用应被中断并因EINTR而失败 这通常可以正常工作,除非已在受监视的文件描述符上存在挂起的事件,例如在重载情况下,文件描述符上始终存在活动 此示例程序再现了以下问题: include,我相信它会更好地处理这种情况?这是一种资源

我正在尝试添加一个信号处理程序,以便对我的事件驱动应用程序进行适当的清理

我的SIGINT信号处理程序只更改全局标志变量的值,然后在主循环中检查该变量。为避免比赛,除pselect呼叫期间外,信号始终被阻止。这将导致仅在pselect调用期间发送挂起的信号,pselect调用应被中断并因EINTR而失败

这通常可以正常工作,除非已在受监视的文件描述符上存在挂起的事件,例如在重载情况下,文件描述符上始终存在活动

此示例程序再现了以下问题:


include,我相信它会更好地处理这种情况?

这是一种资源匮乏,因为总是按相同的顺序检查活动资源。当总是以相同的顺序检查资源时,如果首先检查的资源足够忙,那么以后检查的资源可能永远不会得到任何注意

pselect的Linux实现显然是在检查信号之前检查文件描述符。BSD实现的作用正好相反

无论如何,美国:

如果所选描述符均未为请求的操作做好准备,则pselect或select功能应阻塞,直到至少一个请求的操作准备就绪、超时发生或被信号中断

严格阅读该描述需要首先检查描述符。如果任何描述符处于活动状态,pselect将返回该描述符,而不是在errno设置为EINTR时失败

在这种情况下,如果描述符非常繁忙,以至于一个描述符始终处于活动状态,那么信号处理就会变得匮乏

如果信号输入过快,BSD实现可能会缺少活动描述符


一个常见的解决方案是每次select调用或类似调用返回时始终处理所有活动资源。但在当前的设计中将信号与描述符混合的情况下,您无法做到这一点,因为如果存在活动描述符,pselect甚至无法检查挂起的信号。正如@Shawn在评论中提到的,您可以使用将信号映射到文件描述符。然后将signalfd中的描述符添加到传递给pselect的文件描述符集

只是一个旁注:以这种方式使用断言是自找麻烦的,因为表达式在非调试构建中都被删除了:断言永远不会有副作用。但首先要感谢使用它们。你可以考虑使用signalfd而不是信号处理程序。在Linux上,使用eventfd比使用自管道要好。@SteveFriedl你完全正确。我不会在生产代码中这样做;这可以100%归因于懒惰。我只是觉得这是将错误检查添加到这个快速而肮脏的测试程序中最简单的方法。我将修改代码以消除断言的副作用。@Shawn signalfd中的一些不错的历史记录:。这对我来说是一种幽默,至少在这里是一种咆哮:这让我渴望MS-DOS的日子,那时我可以植入自己的中断处理程序:-@SteveFriedl绝对如此。我真的很开心,这很有道理。我想我期望BSD行为,因为它在我的用例中更有意义,当接收到信号时,它会优雅地退出,在这个用例中,文件描述符上可能有很多活动,而信号很少被传递。在这种情况下,信号处理不足不太可能成为问题。