使用timer_create
,我们向等待select
函数的线程传递实时信号。
该信号在线程中被捕获和处理。基于事实,当信号被捕获时,选择将被中断,如果select
失败并且错误号为EINTR
,我会实施一些逻辑。
这在大多数情况下都可以正常工作,但偶尔我会注意到select
没有被中断(或者某些EINTR
案例中的代码没有被执行)。
可能的原因是什么?
答案 0 :(得分:2)
当传递定时器到期信号时,您可能不会在select
中等待,因此它不会返回EINTR
。
如果您希望仅在EINTR
中阻止该帖子时才接收select
,您可以使用pthread_sigmask
阻止线程中的该信号并使用pselect
或{{ 3}}只会在等待时解锁该信号。这样,代码的其余部分无需关心处理EINTR
。
如果进程中有多个线程,请确保在所有其他线程中阻止该信号,以便只有一个线程传递该信号。有关详细信息,请参阅epoll_pwait
。
更优雅的选项(IMO)是避免使用timer_create
而是将延迟传递给下一个计时器到期select
超时参数(这是Signal Concepts所做的) 。但这需要你维持自己的最小定时器堆。