Эполл: он молча удаляет FDS?
Я читал исходный код libev и наткнулся на этот комментарий:
а) epoll молча удаляет fds из набора fd. поскольку ничто не говорит нам о том, что иначе fd был удален, мы должны постоянно "перевооружать" fd, которые, как мы подозреваем, могли бы изменить (та же проблема с kqueue, но там гораздо дешевле).
Я проводил некоторые тесты с epoll (напрямую используя syscalls) на каком-то современном ядре Linux и не смог воспроизвести его. Я не видел никаких проблем с "тихо исчезающими fds". Может кто-нибудь уточнить это и сказать мне, если это все еще проблема?
1 ответ
Это довольно расплывчатый текст, но я думаю, что это просто, если дескриптор close
в другом месте, он тихо удален из набора. Из руководств Linux, epoll (7):
Q6 Будет ли закрытие файлового дескриптора причиной его автоматического удаления из всех наборов epoll?
A6 Да, но помните о следующем. Описатель файла - это ссылка на описание открытого файла (см.
open(2)
). Всякий раз, когда дескриптор дублируется с помощьюdup(2)
,dup2(2)
,fcntl(2)
F_DUPFD
, или жеfork(2)
создается новый дескриптор файла, ссылающийся на то же самое описание открытого файла. Открытое описание файла продолжает существовать до тех пор, пока все дескрипторы файлов, ссылающиеся на него, не будут закрыты. Файловый дескриптор удаляется из набора epoll только после того, как все файловые дескрипторы, ссылающиеся на описание открытого открытого файла, были закрыты (или до того, как дескриптор был явно удален с использованиемepoll_ctl(2)
EPOLL_CTL_DEL
). Это означает, что даже после того, как файловый дескриптор, который является частью набора epoll, был закрыт, о событиях для этого дескриптора файла могут быть сообщены, если другие файловые дескрипторы, ссылающиеся на то же основное описание файла, остаются открытыми.
Итак, у вас есть сокет с FD 42. Он получает close
г, а затем удалены из epoll
объект. Но ядро не уведомляет libev
об этом через epoll_wait
, Теперь epoll_modify
вызывается снова с помощью fd = 42
, epoll_modify
не знает, является ли этот файловый дескриптор 42 тем же, что уже был в epoll
объект или какое-либо другое описание файла с повторным использованием дескриптора файла номер 42.
Можно также утверждать, что комментарии просто разглагольствуют и дизайн libev
Здесь виноват API.