【问题标题】:Delayed execution using epoll main loop使用 epoll 主循环延迟执行
【发布时间】:2011-08-15 22:18:04
【问题描述】:

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

【问题讨论】:

    标签: c asynchronous epoll


    【解决方案1】:

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

    【讨论】:

    • 谢谢,这正是我想要的!
    【解决方案2】:

    愚蠢的问题:为什么不明确地跟踪时间?我在一个多 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

    【讨论】:

    • 正如我所写的,我只是想要一种更清洁的 epoll 方式来做这件事,但是是的,这是我所看到的另一种方式。如果在合理时间内没有发布其他答案,将接受此答案。
    • 这种方法将毫无理由地以 100% 加载 cpu。当你想睡觉时,你不应该旋转。
    • "你不应该在你想睡觉的时候旋转" 你应该在响应时间很重要的时候旋转(你不能保证你什么时候从睡眠中回来,并且你会招致系统调用——有特殊的将 epoll 操作减少到用户空间的 NIC,有效地允许您运行而不会冒险进入内核)
    • 同意,无事可做时没有必要醒来。 epoll timeout 应该是直到最早的计时器的持续时间,如果没有计时器,则为 -1。
    猜你喜欢
    • 1970-01-01
    • 2014-06-02
    • 1970-01-01
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    • 2016-08-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多