我正在尝试将epoll_wait与timerfd API集成。我需要非阻塞的timerfd读取和阻塞epoll_wait,这应该在timerfd文件描述符准备好读取时触发。
我将epoll_wait事件标志设置为epolin,并使用TFD_NONBLOCK标志调用timerfd create函数。在这种情况下,我成功地获得了计时器消息。但我的问题是:epoll_wait是不断触发的,因为总是有EPOLLIN事件。即使接收到epolin事件;计时器fd的非阻塞读取返回EAGAIN,直到下一个timerfd过期。
我很困惑为什么epoll in在计时器fd还没有得到值并且它的read调用返回EAGAIN的情况下仍然从epoll-wait返回?
第二步我试图将epoll|u wait事件设置为(EPOLLIN|EPOLLET)。这个时间计时器fd read调用了一次,第一个EPOLLIN和epoll_wait被永远阻塞。
使用定时器fd和epoll_wait是否有错误的假设?
最佳答案
您可以将timerfd与epoll_wait()调用一起使用。
确保将超时指定为-1以使其成为阻塞调用。
例如:epoll_wait(epfd,evlist,MAX_EVENTS,-1);