我正在重写一个多线程Linux-2.6.32+应用程序,将select
替换为epoll
。
create1(2)的手册页声明:
如果标志为0,那么,除了删除过时的size参数之外,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
引入游戏有什么意义?
谢谢你在这个问题上给我启发。
发布于 2012-04-04 12:44:19
使用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()
的优点是它允许您指定标志,我认为这些标志目前仅限于关闭-on-exec(这样,当exec
-ing另一个程序时文件描述符就会自动关闭)。
发布于 2012-04-04 12:52:07
epoll_create1()
提供了一种设置标志的方法。现在不必设置尺寸了。
实际上在内核源代码中:/fs/ventpoll.c
SYSCALL_DEFINE1(epoll_create, int, size)
{
if (size <= 0)
return -EINVAL;
return sys_epoll_create1(0);
}
epoll_wait()
参数max_events
用于控制返回fd计数,而不是整个eventpoll
结构中的fd总数。
https://stackoverflow.com/questions/10011252
复制相似问题