【问题标题】:What's the advantage of using epoll_create1() instead of epoll_create()使用 epoll_create1() 代替 epoll_create() 有什么好处
【发布时间】:2012-04-04 12:38:18
【问题描述】:

我正在重写一个多线程 Linux-2.6.32+ 应用程序以将 select 替换为 epoll

epoll_create1(2) 的手册页声明:

如果 flags 为 0,那么除了删除 过时的大小参数之外,epoll_create1() 与 epoll_create() 相同。

然而,epoll_wait(2) 中使用的这个过时的大小参数不是maxevents吗?

epoll_wait(int epfd, struct epoll_event *events,
                  int maxevents, int timeout);

这意味着在使用 epoll 时,我们可以避免在 epoll_create1 中声明最大事件数,但迟早在调用 epoll_wait 时必须引用它?如果是这样,将epoll_create1 带入游戏有什么意义?

感谢您在这个问题上启发我。

【问题讨论】:

    标签: c asynchronous network-programming epoll


    【解决方案1】:

    使用epoll_wait()maxevents 告诉您将返回给您的最大事件数。它与内核中维护了多少无关。

    旧版本的epoll_create() 使用大小来设置某些限制,但不再这样做,因此size 参数已过时的评论。源代码(在fs/eventpoll.c 中,截至本答案)表明了这一点:

    SYSCALL_DEFINE1(epoll_create1, int, flags) {
        return do_epoll_create(flags);
    }
    SYSCALL_DEFINE1(epoll_create, int, size) {
        if (size <= 0) return -EINVAL;
        return do_epoll_create(0);
    }
    

    您可以看到它们几乎相同,除了:

    • epoll_create1() 接受标志,将它们传递给do_epoll_create()
    • epoll_create() 接受大小,检查它,否则忽略它;
    • epoll_create() 将默认标志(无)传递给 do_epoll_create()

    因此使用epoll_create1() 的优点是它允许您指定标志,我认为目前仅限于close-on-exec(以便在exec-ing 另一个程序时自动关闭文件描述符)。

    【讨论】:

    • 感谢您的解释。在epoll_create1 中,我只是让内核本身来确定它的内部结构,好吧。我在想maxevents 参数也会被删除,但事实并非如此。
    【解决方案2】:

    epoll_create1() 提供了一种设置标志的方法。现在不用设置大小了。

    其实在内核源码中:/fs/eventpoll.c

    SYSCALL_DEFINE1(epoll_create, int, size)
    {
        if (size <= 0)
            return -EINVAL;
    
        return sys_epoll_create1(0);
    }
    

    epoll_wait() 参数 max_events 用于控制返回 fd 计数而不是整个 eventpoll 结构中的总 fd 计数

    【讨论】:

    • 好的,我现在看到epoll_createsize 参数和epoll_waitmaxevents 不是一回事。谢谢。
    猜你喜欢
    • 2011-09-29
    • 1970-01-01
    • 2018-12-24
    • 2021-02-20
    • 2011-01-11
    • 1970-01-01
    • 1970-01-01
    • 2013-03-06
    • 2018-02-06
    相关资源
    最近更新 更多