epoll是否保留fd的注册顺序?

问题描述 投票:6回答:1

我正在研究Linux系统调用,发现epoll的某些方面对我来说还不清楚。说,我创建一个epoll实例:

epollfd = epoll_create(50);

接下来,我在for循环中注册50个文件描述符:

for(i=0; i<50; i++){
    // open file "file-i".txt
    // construct epoll_event
    // register new file descriptor with epoll_ctl(epollfd, EPOLL_CTL_ADD ...

现在我们有50个文件,可以执行操作了(读或写-没关系)。我们将MAX_EVENTS设置为3:

#define MAX_EVENTS 3
...
struct epoll_event events[MAX_EVENTS]
...
epoll_wait(epollfd, events, MAX_EVENTS, -1)

[这50个文件全部准备就绪,我们只要求其中3个。哪些文件将位于events数组中?

  • [[1,2,3]-前3个文件,以将它们添加到epoll中的顺序
  • [[48,49,50]-按添加到epoll的顺序排列的最后3个文件
  • [[34,7,15]-随机3个文件
  • 任何其他选项

谢谢。

c linux epoll
1个回答
7
投票

仔细阅读epoll的源文件,可以看到就绪事件保留在链接列表中。事件从列表的开头删除,并添加到列表的末尾。

基于此,答案是描述符顺序基于它们准备就绪的顺序。

[此行为现在记录在epoll的注释中:

[如果epoll_wait时准备好多个epoll_wait文件描述符,被调用,则连续的maxevents调用将循环通过准备好的文件描述符集。 ...

文档感谢epoll_wait()

© www.soinside.com 2019 - 2024. All rights reserved.