如何使用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似乎是一个更清洁的解决方案。
答案 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中的gettimeofday
或rdtsc
来实现。 YMMV