首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用epoll_create1()而不是epoll_create()有什么好处?

使用epoll_create1()而不是epoll_create()有什么好处?
EN

Stack Overflow用户
提问于 2012-04-04 12:38:18
回答 2查看 8.1K关注 0票数 10

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

create1(2)的手册页声明:

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

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

代码语言:javascript
运行
复制
epoll_wait(int epfd, struct epoll_event *events,
                  int maxevents, int timeout);

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

谢谢你在这个问题上给我启发。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-04-04 12:44:19

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

较早版本的epoll_create()使用这个大小来设置某些限制,但这不再是这样做的,因此size参数已经过时。源代码证明了这一点(在本答复时是在fs/eventpoll.c中):

代码语言:javascript
运行
复制
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()的优点是它允许您指定标志,我认为这些标志目前仅限于关闭-on-exec(这样,当exec-ing另一个程序时文件描述符就会自动关闭)。

票数 11
EN

Stack Overflow用户

发布于 2012-04-04 12:52:07

epoll_create1()提供了一种设置标志的方法。现在不必设置尺寸了。

实际上在内核源代码中:/fs/ventpoll.c

代码语言:javascript
运行
复制
SYSCALL_DEFINE1(epoll_create, int, size)
{
    if (size <= 0)
        return -EINVAL;

    return sys_epoll_create1(0);
}

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10011252

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档