c - epoll_wait with timerfd api 用于非阻塞读取

标签 c linux timer posix epoll

我正在尝试将 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)。这次定时器 fd read 调用一次,第一个 EPOLLIN 和 epoll_wait 永远阻塞。

将定时器 fd 与 epoll_wait 一起使用是否有错误的假设?

最佳答案

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

关于c - epoll_wait with timerfd api 用于非阻塞读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49983993/

相关文章:

python - Linux BC : Decimal/Floating Calculation NOT Accurate

linux - 多行变量中导出的含义是什么

python - 在 pygame 中使用计时器来触发某些东西

c - 编写一个函数来分割字符串

C 压痕工具

linux - 使用重命名更改复杂文件名中的一个数字

java - 正确更新 Swing 组件?

java - EJB 3.x 中@Schedule 方法的动态参数

c - header 未找到 typedef 的结构

c - 如何用环绕或溢出减去两个无符号整数