我使用带有 TFD_NONBLOCK
选项的 timerfd。
这个计时器被添加到只有 EPOLLIN
事件集的 epoll Controller 。
如果 EPOLLIN
发生,则在此计时器上使用 read()
。
在 99% 的情况下一切正常。执行在 epoll_wait
停止,然后在定时器间隔后继续。然而,在繁重的系统负载下,我收到了几次来自 read()
的 EAGAIN
。
这看起来像我收到了 EPOLLIN
但没有任何内容可供阅读。
最佳答案
我可能找到了答案。
在我的程序中,我同时使用了几个计时器,其中一些正在修改其他计时器的间隔。在负载很少或没有负载的情况下,epoll 一次执行单个事件。在重负载下,一些事件被排队,然后循环执行。在处理队列时,如果第一个事件修改了下一个计时器的间隔 - 它变为“未就绪”。但随后循环继续到第二个计时器,导致 read() on-ready-anymore 计时器。
关于linux - epoll 为 timerfd 报告 EPOLLIN 后,read() 返回 EAGAIN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34624230/