【问题标题】:Do I need to re-initialize epoll_wait's events array?我需要重新初始化 epoll_wait 的事件数组吗?
【发布时间】:2019-08-15 11:05:23
【问题描述】:

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

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

3) 我尚未处理的 fds 是否会在下一次迭代中重新写入数组中? (我用的是level触发的epoll)我不会错过ready fds?

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

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

【问题讨论】:

    标签: c epoll


    【解决方案1】:

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

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

    【讨论】:

    • 您能否详细说明“只要您始终使用第一个 nfds 元素。”
    • @IdolAdmin,我已经扩展了答案。
    • 我明白了,谢谢!!!添加到问题中:如果我分配的数组比准备好的 fds 更小,会发生什么情况,因为我没有处理它们,它们会在下一次迭代中重写吗?还是他们会迷路?
    • @IdolAdmin,这是一个非常好的问题,但不幸的是我不知道,我也找不到任何关于此事的文档。我认为您必须进行一些实验才能找到答案。我还建议将此作为单独的问题提出,因为它对其他人可能非常有用。
    • 我找到了这个答案,它声称事件将在下一次迭代中出现,我需要验证这一点.. stackoverflow.com/questions/16640430/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    • 2023-01-12
    • 2023-03-17
    相关资源
    最近更新 更多