Linux read()在epoll为timerfd报告EPOLLIN后返回EAGAIN

Linux read()在epoll为timerfd报告EPOLLIN后返回EAGAIN,linux,timer,epoll,Linux,Timer,Epoll,我使用带有TFD\u NONBLOCK选项的timerfd 此计时器添加到epoll控制器时仅设置了EPOLLIN事件。 如果出现EPOLLIN,则此计时器上使用read() 在99%的情况下,一切都很好。在epoll\u wait上停止执行,然后在计时器间隔后继续执行。然而,在系统负载较重的情况下,我收到了来自read()的EAGAIN几次 这看起来像是我收到了EPOLLIN,但是没有任何东西可以阅读。i可能找到了答案 在我的程序中,我同时使用了几个计时器,其中一些计时器正在修改其他计时器的间

我使用带有
TFD\u NONBLOCK
选项的timerfd

此计时器添加到epoll控制器时仅设置了
EPOLLIN
事件。 如果出现
EPOLLIN
,则此计时器上使用
read()

在99%的情况下,一切都很好。在
epoll\u wait
上停止执行,然后在计时器间隔后继续执行。然而,在系统负载较重的情况下,我收到了来自
read()
EAGAIN
几次


这看起来像是我收到了EPOLLIN,但是没有任何东西可以阅读。

i可能找到了答案


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

过了一段时间,我可以说-这是一个解决方案:)