使用epoll主循环延迟执行

时间:2011-08-15 22:18:05

标签: c asynchronous epoll

如何使用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似乎是一个更清洁的解决方案。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:-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可以使用linux中的gettimeofdayrdtsc来实现。 YMMV