человек эпол:
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.
Представьте, что у нас есть два fd: первый пассивен, данные доступны только иногда, второй активен, только данные иногда недоступны.
epoll_wait вернул, что мы можем прочитать оба. Мы читаем {первое, затем второе} в цикле (без обращений к epoll_wait, поскольку он может внезапно блокироваться, пока данные еще доступны).
Теперь первый дескриптор файла вернул EAGAIN при чтении.
Что делать?
- Если мы продолжим чтение второго fd в цикле (без вызовов epoll_wait), мы можем упустить, что данные стали доступны на первом fd. Он будет просто читать, читать и читать без EAGAIN.
- Если мы будем «консультироваться» с epoll_wait перед каждым чтением со второго fd, 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, даже если нет событий.