【发布时间】:2018-10-03 16:06:12
【问题描述】:
我正在尝试将 epoll_wait 与 timerfd API 集成。我需要非阻塞 timerfd 读取和阻塞 epoll_wait 应该在 timerfd 文件描述符准备好读取时触发。
我将 epoll_wait 事件标志设置为 EPOLLIN 并使用 TFD_NONBLOCK 标志调用 timerfd 创建函数。在这种情况下,我成功收到了计时器消息。但我的问题:epoll_wait 不断触发,因为总是收到 EPOLLIN 事件。即使收到 EPOLLIN 事件;定时器 fd 的非阻塞读取返回 EAGAIN,直到下一个 timerfd 到期。
我很困惑为什么 EPOLLIN 连续从 epoll_wait 返回,尽管计时器 fd 还没有得到一个值并且它的读取调用返回 EAGAIN?
第二步我尝试将 epoll_wait 事件设置为 (EPOLLIN | EPOLLET)。这次 timer fd read 调用了一次,第一个 EPOLLIN 和 epoll_wait 永远阻塞了。
将定时器 fd 与 epoll_wait 一起使用是否有错误的假设?
【问题讨论】: