带有timerfd api的epoll_wait用于非阻塞读取

时间:2018-04-23 14:50:22

标签: c linux timer posix epoll

我正在尝试将epoll_wait与timerfd API集成。我需要非阻塞timerfd读取和阻止epoll_wait,当timerfd文件描述符准备好读取时应该触发它。

我将epoll_wait事件标志设置为EPOLLIN,并使用TFD_NONBLOCK标志调用timerfd create function。在这种情况下,我成功获得了计时器消息但是我的问题是:epoll_wait是连续触发的,因为总是得到EPOLLIN事件。即使收到EPOLLIN事件;计时器fd的非阻塞读取返回EAGAIN直到下一个timerfd到期。

我很困惑为什么EPOLLIN连续从epoll_wait返回,尽管计时器fd还没有得到值,它的读取调用返回EAGAIN?

第二步我尝试将epoll_wait事件设置为(EPOLLIN | EPOLLET)。这个时间定时器fd读取一次,第一次EPOLLIN和epoll_wait被永久阻止。

使用带有epoll_wait的计时器fd是否有错误的假设?

1 个答案:

答案 0 :(得分:0)

您可以将timerfd与epoll_wait()调用一起使用。 确保将超时指定为-1以使其成为阻塞调用。 例如:epoll_wait(epfd,evlist,MAX_EVENTS,-1);