【问题标题】:epoll_wait with timerfd api for non blocking readsepoll_wait 和 timerfd api 用于非阻塞读取
【发布时间】: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 一起使用是否有错误的假设?

【问题讨论】:

    标签: c linux timer posix epoll


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2012-09-11
      • 1970-01-01
      • 1970-01-01
      • 2014-11-17
      • 2015-05-05
      • 2014-04-24
      • 2017-02-18
      • 1970-01-01
      相关资源
      最近更新 更多