我正在重写一个多线程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_create1
这意味着在使用epoll时我们可以避免在epoll_wait
中声明最大数量的事件,但在调用epoll_create1
时我们迟早会引用它?如果是这样,将{{1}}带入游戏的重点是什么?
感谢您对此主题的启发。
答案 0 :(得分:7)
不,使用epoll_wait
,maxevents
会告诉您返回的最大事件数。它与内核中维护的事件数无关。
较旧版本的epoll_create
使用大小来设置某些限制,但不再使用它,因此size
参数已过时的注释。
使用epoll_create1
的优点是它允许您指定标志,我认为这些标志目前仅限于close-on-exec(以便在exec
时自动关闭文件描述符另一个过程)。
答案 1 :(得分: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计数