在epoll报告了用于timerfd的EPOLLIN之后,read()返回EAGAIN

时间:2016-01-06 01:29:54

标签: linux timer epoll

我将timerfd与TFD_NONBLOCK选项一起使用。

此计时器已添加到仅设置了EPOLLIN事件的epoll控制器中。 如果发生EPOLLIN,则此计时器将使用read()

在99%的情况下,一切都很好。执行在epoll_wait停止,然后在定时器间隔后继续。但是,在系统负载较重的情况下,我几次从EAGAIN收到read()

这看起来像是我收到了EPOLLIN但是没有任何内容可供阅读。

1 个答案:

答案 0 :(得分:2)

可能找到答案。

在我的计划中,我一次使用了一些计时器,其中一些正在修改其他计时器的间隔。 epoll很少或没有负载,一次执行单个事件。在高负载下,一些事件排队,然后循环执行。在处理队列时,如果第一个事件修改了下一个计时器的间隔 - 它变为'未准备好'。但是接着循环继续进入第二个定时器,导致read-on on not ready-anymore timer。