0

如何使用创建延迟执行代码或超时事件epoll?libevent 和 libev 都有这个功能,但我不知道如何使用 epoll 来做到这一点。

目前主循环如下所示:

epoll_ctl(epfd, EPOLL_CTL_ADD, client_sock_fd, &epev);

while(1) {
    int nfds = epoll_wait(epfd, &epev, 1, 10);
    if (nfds < 0) exit(EXIT_FAILURE);
    if (nfds > 0) {
        // If an event has been recieved
    }
    // Do this every 10ms
}

我很清楚,这个功能可以通过简单地添加已经过去的时间来实现,但使用 epoll 似乎是一个更清洁的解决方案。

4

2 回答 2

1

您可以创建timerfd并将文件描述符添加到 epoll_wait

于 2011-08-18T22:45:31.870 回答
-1

愚蠢的问题:为什么不明确地跟踪时间?我在多 TCP 客户端(用于发送心跳)中执行此操作,循环本质上是:

uint64_t last = get_time_in_usec();
uint64_t event_interval = 10 * 1000;
while(1) {
    int nfds = epoll_wait(epfd, &epev, 1, 0); /* note that i set timeout = 0 */
    if (nfds <= 0) { /* do some cleanup logic, handle EAGAIN */
    if (nfds > 0) { /* If an event has been received */ }
    if(get_time_in_usec() >= last + event_interval) { ... }
}

get_time_in_usec可以使用gettimeofdayrdtsc在linux中实现。YMMV

于 2011-08-15T22:32:59.010 回答