使用timer_create
,我们将实时信号传递给等待select
函数的线程。
该信号在线程中捕获并处理。基于事实,选择将在捕获信号时中断,如果select
失败,错误号为EINTR
,我将执行一些逻辑。
在大多数情况下,这都可以正常工作,但是偶尔我会注意到select
没有被打断(或者EINTR
情况下的代码没有被执行)。
有什么可能的原因?
最佳答案
可能是当计时器到期信号发出时,您没有等待select
,因此它不返回EINTR
。
如果您只想在EINTR
中阻塞线程时才接收select
,则可以使用 pthread_sigmask
阻塞线程中的该信号,并使用 pselect
或 epoll_pwait
在仅等待时取消阻塞该信号。这样,您的其余代码无需与EINTR
的处理有关。
如果进程中有多个线程,请确保在所有其他线程中阻塞该信号,以便只有一个线程传递该信号。有关更多详细信息,请参见Signal Concepts。
更好的选择(IMO)是避免使用timer_create
,而是将延迟作为select
超时参数传递给下一个计时器到期(这是libevent所做的)。但这需要您维护自己的最小计时器。
关于linux - 选择系统偶尔不会因EINTR而失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24632341/