10

我正在重写一个多线程 Linux-2.6.32+ 应用程序以替换selectepoll.

epoll_create1(2)的手册页声明:

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

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

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

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

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

4

2 回答 2

11

使用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().

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

于 2012-04-04T12:44:19.153 回答
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 计数

于 2012-04-04T12:52:07.650 回答