Вложенный EPOLL FD
Я нахожу в Интернете очень ограниченную информацию о поведении вложенных FD.
Допустим, EPOLL FD1 является общим для EPOLL FD2 и FD3. Так что же произойдет, если epoll FD1 получит событие
- Будет ли оно вызывать событие как для FD2, так и для Fd3, если оно будет добавлено без флага epoll_exclusive.
- После получения события мне нужно сделать epoll_wait на FD1, чтобы очистить событие.
И каков случай использования вложенного epoll FD.
0 ответов
Для случая с запуском уровня это довольно просто:
- Да, вы можете объединить ответы на Q2 и Q3 из раздела Q&A на странице руководства epoll(7):
A2: Если один и тот же файловый дескриптор добавлен к двум экземплярам epoll, события будут сообщаться им обоим.
A3: Если файловый дескриптор epoll имеет ожидающие события, он будет обозначен как доступный для чтения. - Нет, поскольку очистка события актуальна только для epoll, запускаемого фронтом.
Для случая, запускаемого по фронту, мы ожидаем, что ответ на 1 останется таким же, поскольку независимо от вложенности, если тот же FD добавляется с EPOLLET
двум экземплярам epoll они оба будут сообщать о каждом событии один раз.
Я не знаю, как ДОЛЖЕН быть ответ на второй вопрос, но это не имеет значения. Существует ошибка при добавлении FD epoll в режиме запуска по фронту, они просто всегда ведут себя как запускаемые по уровню, FD2 и FD3 будут продолжать показывать, что FD1 доступен для чтения, пока у него есть ожидающие события. Вы можете увидеть эту ветку о попытке исправить это, которое, как мне кажется, еще не было сделано на материке:fs / epoll: fix the edge-triggered mode for nested epoll
который ссылается на этот репозиторий GitHub, который тестирует множество различных сценариев, которые вам может показаться интересным.