2011-08-15 105 views
0

如何使用epoll创建延迟执行的代码或超时事件? libevent和libev都具有这些功能,但我无法弄清楚如何使用epoll来做到这一点。使用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的似乎是一个清晰的解决方案来实现。

回答

1

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

+0

谢谢,这正是我想要的! – Hobblin

-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实现。因人而异

+0

正如我写了我只是想这样做的清洁epoll的方式,但没错,这就是做这件事,因为我看到它的另一种方式。如果在合理的时间内没有其他人发布,将接受这个答案。 – Hobblin

+0

我的观点是循环可能有一个0超时 –

+2

这种方法将无法正确加载100%的cpu。当你想睡觉时你不应该旋转。 –