我正在尝试将 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/