gpt4 book ai didi

linux - 如何使用 epoll_select 和 EPOLLET 读取多个文件描述符?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:12:21 28 4
gpt4 key购买 nike

人 epoll:

The suggested way to use epoll as an edge-triggered (EPOLLET) interface is as follows:
i with nonblocking file descriptors; and
ii by waiting for an event only after read(2) or write(2) return EAGAIN.

假设我们有两个 fds:第一个是被动的,数据仅有时可用,第二个是主动的,数据仅有时不可用。

epoll_wait 返回我们可以读取两者。我们在循环中读取{第一个,而不是第二个}(没有调用 epoll_wait 因为它可能会在数据仍然可用时突然阻塞)。

现在第一个文件描述符在读取时返回 EAGAIN。

怎么办?

  1. 如果我们继续在循环中读取第二个 fd(不调用 epoll_wait),我们可能会错过第一个 fd 上可用的数据。它只会读啊读啊读,没有 EAGAIN。
  2. 如果我们在每次从第二个 fd 读取之前“咨询”epoll_wait,epoll_wait 可能会突然阻塞,因为与上一次调用相比没有任何变化(数据在第一个 FD 上仍然不可用,但在第二个 FD 上仍然可用)。

如何继续处理第二个 FD,但又不忘记第一个 FD?

更新:又发现一件事:man epoll_wait:

while specifying timeout equal to zero makes epoll_wait() to return immediately even if no events are available

有了它,即使没有事件,我也可以为 FD 枚举事件。

最佳答案

如果 FD2 始终可读,您可能会认为 epoll 不适合它。只是坐下来阅读它可能是值得的。

否则,在循环中读取 FD2 直到它耗尽,但在循环中让它每隔 X 次尝试读取 FD1 一次。如果 FD1 有数据,则读取它。如果不是,您将得到 EAGAIN,重置 X 计数器并返回读取 FD2。当两者都耗尽时,您将回到 epoll_wait。

类似于:

count = 1;

while (true)
{
read fd2;

if (EAGAIN)
break;
else
process data;

count--;

if (! count)
{
while (true)
{
read fd1;

if (EAGAIN)
count = 10;
break;
else
process data;
}
}
}

关于linux - 如何使用 epoll_select 和 EPOLLET 读取多个文件描述符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4003804/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com