1
1
不,但它也没有指定多个信号可以或必须。由于未指定,因此最好遵循一般规则,该规则允许处理所有挂起的未屏蔽信号。如果您试图严格依赖这一点,那么您可能会走上一条错误的道路,因为异步事件的时间很难预测。 一般来说,很难实现一个只施加一个限制的实现,因为os运行时必须保留一个或多个挂起的信号,但在某个未指定的点之前不加屏蔽。请记住,当pselect被中断时运行的信号处理程序可以执行siglongjmp,而不是返回,因此内核必须保持一个复杂的、可能没有边界的数据结构,以跟踪要执行的信号掩码。 下面是您的测试程序的修改版本。在本例中,每个事件都通过write()发出一个字符串,因此没有缓冲问题。程序将其–main–环境设置为屏蔽SIGUSR1、SIGUSR2;但当pselect运行时,它允许SIGUSR1、SIGUSR2、SIGTERM。 程序分叉,父级(默认值:)位于调用pselect()的循环中,然后输出。完成后。 孩子们坐成一个圈,把SIGUSR1、SIGUSR2传递给父母,然后睡一会儿。发送信号后输出^。 处理程序发出一个前缀(1或(2表示SIGUSR1,SIGUSR2 resp;然后休眠一位,并输出)以指示休眠已完成。 我在macos(10.12.6,但我怀疑这是否重要)上看到的输出是: ^(2)(1).^(2)(1).^(2)(1).^(2)(1).终止日期:15 这表示每次调用pselect()时,都会运行SIGUSR1和SIGUSR2的信号处理程序。这就是我所期望的;因为它的设计不允许出现不确定性窗口,就像使用sigprocmasks()的括号select()一样。
|
2
0
我一直在继续搜索,没有发现任何其他信息,所以我只能得出结论,POSIX中一般没有保证。
在Linux下,如果我正确理解了下面的代码,那么只能处理一个信号(假设信号处理程序本身没有取消屏蔽信号):相关的代码和一条说明性的注释在fs/select中。c、 在
它基本上从系统调用返回,允许信号处理程序执行,然后立即恢复原始信号掩码(从
以下测试程序对此进行验证:
在Linux上,上述输出一致:
FreeBSD似乎也是如此;然而,我不希望在所有其他平台上都出现这种情况。我找到的确保只能处理一个信号的解决方案是
基本上,该代码如下所示:
信号处理程序必须执行
这感觉很粗糙,但似乎在我测试过的所有平台(Linux、MacOS和FreeBSD)上都能正常工作,而且POSIX一般都支持它。 |
ugsgknt · Mysql从具有两个id列的同一个表中获取结果 2 年前 |
Adriaan · 已选择多个大小写的条件格式 6 年前 |
Ross · MySQL嵌套选择与联接表 6 年前 |
Nol · Mysql从数据库中选择位置后的更多项目 6 年前 |
Noones · 同一公司的SQL地址表需要最新联系人 6 年前 |
spice · 将多个元素绑定到同一个函数jQuery 6 年前 |
CalcGuy · MySQL,Insert语句,值为select语句 6 年前 |