Дублирующий дескриптор файла epoll
Есть ли способ дублировать дескриптор файла, созданный с помощью epoll_create
таким образом, что копия может быть изменена (добавление / удаление дескрипторов просматриваемого файла с использованием epoll_ctl
) независимо.
Например, я создаю дескриптор файла epoll A
который ждет событий в файлах P
а также Q
, Я копирую его в дескриптор файла epoll B
, и сделать B
также ждет событий в файле R
, призвание epoll_wait(A)
все равно будет только ждать P
а также Q
,
Это поведение при звонке dup
на A
или это необходимо для воссоздания дескриптора файла epoll с помощью epoll_create
а также epoll_ctl
?
2 ответа
Это немного сбивает с толку.
Когда вы открываете новый файл, создаются две сущности. Один, если файл обрабатывать в ядре. Другой - дескриптор файла, число, ссылающееся на этот дескриптор файла.
Хотя я точно не знаю, что произойдет с epoll fd, я предполагаю, что он такой же, как и с любыми другими дублирующимися fd, и это то, что они имеют одинаковый дескриптор файла.
Для намека на это, этот отрывок из epoll(2)
Справочная страница может помочь:
Q6 Будет ли закрытие файлового дескриптора причиной его автоматического удаления из всех наборов epoll?
A6 Да, но помните о следующем. Описатель файла - это ссылка на описание открытого файла (см.
open(2)
). Всякий раз, когда дескриптор дублируется с помощьюdup(2)
,dup2(2)
,fcntl(2)
F_DUPFD
, или жеfork(2)
создается новый дескриптор файла, ссылающийся на то же самое описание открытого файла. Открытое описание файла продолжает существовать до тех пор, пока все дескрипторы файлов, ссылающиеся на него, не будут закрыты. Файловый дескриптор удаляется из набора epoll только после того, как все файловые дескрипторы, ссылающиеся на описание открытого открытого файла, были закрыты (или до того, как дескриптор был явно удален с использованиемepoll_ctl(2)
EPOLL_CTL_DEL
).
Это означает, что даже после того, как дескриптор файла, который является частью набора epoll, был закрыт, о событиях для этого дескриптора файла могут быть сообщены, если другие файловые дескрипторы, ссылающиеся на то же основное описание файла, остаются открытыми.
Так что, хотя я не проверял это сам, я предполагаю, что dup
не позволит вам никоим образом дублировать список фильтров epoll. И то и другое fd
s будет ссылаться на тот же дескриптор файла. Любое изменение фильтра, выполненное для одного, будет отражено в другом.
К сожалению, так как нет API, о котором я знаю, чтобы запросить epoll
Список фильтров, это означает, что у вас нет возможности делать то, что вы хотите, за исключением отслеживания с самого начала.
Вы можете управлять дубликатом epfd для разных базовых файловых структур (или для одной и той же файловой структуры с разными fd) независимо.