read() returns 在 epoll 报告 timerfd 的 EPOLLIN 后 EAGAIN

read() returns EAGAIN after epoll reported EPOLLIN for timerfd

我使用带有 TFD_NONBLOCK 选项的 timerfd。

这个计时器被添加到只有 EPOLLIN 事件集的 epoll 控制器。 如果出现 EPOLLIN,则在此计时器上使用 read()

在 99% 的情况下一切正常。执行在 epoll_wait 停止,然后在定时器间隔后继续。然而,在繁重的系统负载下,我收到了几次来自 read()EAGAIN

我似乎收到了 EPOLLIN,但没有任何内容可供阅读。

可能找到了答案。

在我的程序中,我同时使用了几个计时器,其中一些正在修改其他计时器的间隔。在负载很少或没有负载的情况下,epoll 一次执行单个事件。在重负载下,一些事件被排队,然后循环执行。在处理队列时,如果第一个事件修改了下一个计时器的间隔 - 它变为 'not-ready'。但随后循环进入第二个计时器,导致 not-ready-anymore 计时器上的 read()。