使用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/

10-10 08:40