Вложенный EPOLL FD

Я нахожу в Интернете очень ограниченную информацию о поведении вложенных FD.

Допустим, EPOLL FD1 является общим для EPOLL FD2 и FD3. Так что же произойдет, если epoll FD1 получит событие

  1. Будет ли оно вызывать событие как для FD2, так и для Fd3, если оно будет добавлено без флага epoll_exclusive.
  2. После получения события мне нужно сделать epoll_wait на FD1, чтобы очистить событие.

И каков случай использования вложенного epoll FD.

0 ответов

Для случая с запуском уровня это довольно просто:

  1. Да, вы можете объединить ответы на Q2 и Q3 из раздела Q&A на странице руководства epoll(7):
    A2: Если один и тот же файловый дескриптор добавлен к двум экземплярам epoll, события будут сообщаться им обоим.
    A3: Если файловый дескриптор epoll имеет ожидающие события, он будет обозначен как доступный для чтения.
  2. Нет, поскольку очистка события актуальна только для epoll, запускаемого фронтом.

Для случая, запускаемого по фронту, мы ожидаем, что ответ на 1 останется таким же, поскольку независимо от вложенности, если тот же FD добавляется с EPOLLET двум экземплярам epoll они оба будут сообщать о каждом событии один раз.

Я не знаю, как ДОЛЖЕН быть ответ на второй вопрос, но это не имеет значения. Существует ошибка при добавлении FD epoll в режиме запуска по фронту, они просто всегда ведут себя как запускаемые по уровню, FD2 и FD3 будут продолжать показывать, что FD1 доступен для чтения, пока у него есть ожидающие события. Вы можете увидеть эту ветку о попытке исправить это, которое, как мне кажется, еще не было сделано на материке:fs / epoll: fix the edge-triggered mode for nested epoll
который ссылается на этот репозиторий GitHub, который тестирует множество различных сценариев, которые вам может показаться интересным.

Другие вопросы по тегам