选择系统偶尔使用EINTR不会失败

时间:2014-07-08 12:50:30

标签: linux

使用timer_create,我们向等待select函数的线程传递实时信号。

该信号在线程中被捕获和处理。基于事实,当信号被捕获时,选择将被中断,如果select失败并且错误号为EINTR,我会实施一些逻辑。

这在大多数情况下都可以正常工作,但偶尔我会注意到select没有被中断(或者某些EINTR案例中的代码没有被执行)。

可能的原因是什么?

1 个答案:

答案 0 :(得分:2)

当传递定时器到期信号时,您可能不会在select中等待,因此它不会返回EINTR

如果您希望仅在EINTR中阻止该帖子时才接收select,您可以使用pthread_sigmask阻止线程中的该信号并使用pselect或{{ 3}}只会在等待时解锁该信号。这样,代码的其余部分无需关心处理EINTR

如果进程中有多个线程,请确保在所有其他线程中阻止该信号,以便只有一个线程传递该信号。有关详细信息,请参阅epoll_pwait

更优雅的选项(IMO)是避免使用timer_create而是将延迟传递给下一个计时器到期select超时参数(这是Signal Concepts所做的) 。但这需要你维持自己的最小定时器堆。