我正在研究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
数组中?
谢谢。
仔细阅读epoll
的源文件,可以看到就绪事件保留在链接列表中。事件从列表的开头删除,并添加到列表的末尾。
基于此,答案是描述符顺序基于它们准备就绪的顺序。
[此行为现在记录在epoll
的注释中:
[如果
epoll_wait
时准备好多个epoll_wait
文件描述符,被调用,则连续的maxevents
调用将循环通过准备好的文件描述符集。 ...
文档感谢epoll_wait()
。