与timerfd的epoll

时间:2012-08-24 03:22:26

标签: linux timer epoll

我想使用it_interval的{​​{1}}来设置超时的间隔 但在我的示例中,我只能打印newValue 一次 发生了什么?我该如何设置间隔?

这是我的代码:

timeout

1 个答案:

答案 0 :(得分:18)

这是因为您正在使用EPOLLET而不是读取()生成到tfd中的数据。定时器到期“写入”需要读取的8个字节的数据:您确实需要读取它。打印“超时”时添加此项:

uint64_t value;
read(tfd, &value, 8);

更多细节:EPOLLET要求进行边缘触发,这意味着epoll_wait()只会在文件descritor tfd上说“数据准备好输入”,直到您读取该数据为止。换句话说,只要您没有读取该数据,将来对epoll_wait()的调用将不会再次返回相同的描述符。此行为对于普通套接字很有用,例如如果你在主线程中执行epoll_wait(),请注意一些数据已准备好,然后启动另一个线程来读取它。主线程立即返回epoll_wait()。但我们不希望它再次立即唤醒,即使文件描述符中的数据可能尚未被读取。

请注意,我猜你的没有EPOLLET的例子也是错误的,因为你没有读取(),tfd在初始延迟后总是可读的,所以它会在尽快后打印“超时”初始延迟到期。