考虑如下情况:
使用epoll ET
模式时, epoll_wait
返回就绪文件描述符集合, 然后我们循环处理, 但这时如果有一个文件描述符上有大量输入(不间断的输入流), 因为我们ET
模式需要一直读到返回EAGIN / EWOULDBLOCK
, 那我们就会一直在处理这个文件描述符, 而导致其他文件描述符得不到处理,
这就是采用边缘触发时有可能出现的文件描述符饥饿情况
处理
参考Linux/Unix系统编程手册
63.4.6 节(第1123页)
我一开始没看懂书上说的意思…还是在知乎上有位大哥给我解了惑
- 应用层维护一个
list
, 存储epoll_wait
返回的就绪文件描述符, 然后循环处理 - 在
list
不为空时, 进行循环处理其中事件 - 每个文件描述符只进行一定限度的 IO 操作, 比如每次限定只读 1KB 数据, 然后继续处理其他的文件描述符
- 如果该文件描述符读了 1KB 没读完 (没有返回
EAGIN / EWOULDBLOCK
), 就继续停留在list
中, 反之如果其上的 IO 操作执行完了, 就将其移除list