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

Art*_*nin 6 c linux epoll

我正在玩Linux系统调用,我发现了一些方面epoll,我不清楚.说,我创建一个epoll实例:

epollfd = epoll_create(50);
Run Code Online (Sandbox Code Playgroud)

接下来,我在for-loop中注册了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 ...
Run Code Online (Sandbox Code Playgroud)

现在我们有50个文件,已准备就绪(读取或写入 - 无关紧要).我们将MAX_EVENTS设置为3:

#define MAX_EVENTS 3
...
struct epoll_event events[MAX_EVENTS]
...
epoll_wait(epollfd, events, MAX_EVENTS, -1)
Run Code Online (Sandbox Code Playgroud)

所有这50个文件都准备好了,我们只询问了其中的3个.哪些文件将在events数组中?

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

谢谢.

jxh*_*jxh 7

仔细阅读epoll的源文件,可以看到就绪事件是在链表中维护的.事件从列表的头部删除并添加到列表的末尾.

基于此,答案是描述符顺序基于它们准备好的顺序.

  • 我还想补充一点,每个CPU上都有一个mtx锁定,所以如果你有一个MP机器同时可以使用fd的情况,那么谁就能赢得锁定. (2认同)