gpt4 book ai didi

linux - 选择系统偶尔不会因 EINTR 而失败

转载 作者:太空狗 更新时间:2023-10-29 11:14:10 29 4
gpt4 key购买 nike

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

这个信号在线程中被捕获和处理。基于事实,当捕获到信号时,选择将被中断,如果 select 失败并显示错误号 EINTR,我已经实现了一些逻辑。

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

这可能是什么原因?

最佳答案

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

如果您只想在线程在 select 中被阻塞时接收 EINTR,您可以使用 pthread_sigmask 在线程中阻塞该信号,并使用 pselectepoll_pwait 来解除阻塞仅在等待时发出该信号。这样,您的其余代码就无需关心处理 EINTR

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

一个更优雅的选项 (IMO) 是避免使用 timer_create 而是将延迟作为 select 超时参数传递给下一个计时器到期(这就是 libevent做)。但这需要您维护自己的最小计时器堆。

关于linux - 选择系统偶尔不会因 EINTR 而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24632341/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com