我在pselect的手册页中看到了以下的段落。
需要pselect()的原因是,如果想要等待信号或文件描述符准备就绪,那么需要进行原子测试以防止竞争条件。 (假设信号处理程序设置了一个全局标志并返回。然后,如果信号在测试之后但在呼叫之前到达,则对此全局标志的测试后跟select()的调用可能无限期地挂起。相比之下,pselect ()允许一个人首先阻止信号,处理已经进入的信号,然后用所需的sigmask调用pselect(),避免竞争。)
我不明白该段落中描述的竞争条件是如何发生的。你能帮忙解决一下吗?谢谢。
答案 0 :(得分:0)
假设您的信号处理程序在调用时设置了全局g_Signaled,然后您有如下代码:
if( g_Signaled == false )
{
// Suppose signal is fired here, after test of g_Signaled but before entering select.
select( ... );
}
在这种情况下,即使信号已经触发,select也会无限期地阻塞。 pselect解决了这个问题,因为你可以暂时阻止信号,测试标志,然后使用pselect以原子方式阻塞并重新启用信号。