首页 > 解决方案 > 我需要重新初始化 epoll_wait 的事件数组吗?

问题描述

1)我有epoll_wait(..., events, ...)循环,是否需要在每次迭代之前重新初始化事件数组?

2)根据epoll()手册的例子是不需要的,是不是搞错了?

3) 我尚未处理的 fds 是否会在下一次迭代中重新写入数组中?(我正在使用级别触发的 epoll)我不会错过准备好的 fds?

我尝试阅读内核代码以检查它是否在每次迭代时覆盖数组或仅添加到它,但没有成功(如果你能告诉我它会很棒)。

struct epoll_event ev, events[MAX_EVENTS];
...
for (;;) {
    nfds = epoll_wait(epollfd, events, MAX_EVENTS, -1);
...
}

标签: cepoll

解决方案


epoll_wait返回events它已写入的 ' 元素的数量,您不应该关心数组的其余部分。所以我会说 - 不,你不需要重新初始化这个数组,甚至不需要初始化它,只要你总是使用第一个nfds元素。

进一步详细说明:每次调用后,epoll_wait您肯定知道它填充了数组的第一个nfds元素events,因此您必须遍历这些元素以检查哪些事件发生在哪些描述符上。然而,数组中的其余元素events基本上是来自先前调用或来自该数组分配的任何内存区域的垃圾epoll_wait,因此所有索引 >= 的元素nfds都不包含任何有用的数据。


推荐阅读