這有點令人困惑。
當您打開一個新文件時,會創建兩個實體。一個如果文件在內核中處理。另一個是文件描述符,一個引用該文件句柄的數字。
雖然我不確定epoll fd會發生什麼情況,但我認爲它與任何其他重複的fds相同,並且它們是相同的文件句柄。
對於一個暗示,從epoll(2)
手冊頁的摘錄可能幫助:
Q6將關閉文件描述符導致它被自動從所有epoll的套去掉?
A6是的,但請注意以下幾點。文件描述符是對打開文件描述的引用(請參閱open(2)
)。 每當通過dup(2)
, dup2(2)
,fcntl(2)
F_DUPFD
或fork(2)
複製描述符時,創建引用相同打開文件描述的新文件描述符。一個 開放文件描述繼續存在,直到 指向它的所有文件描述符都已關閉。只有在所有文件描述符參考底層 打開文件描述已關閉(或之前描述符明確使用epoll_ctl(2)
EPOLL_CTL_DEL
)之後,才從epoll集中刪除文件描述符。
這意味着,即使作爲epoll集的一部分的文件描述符 已關閉,如果涉及相同基礎 文件描述的其他文件 描述符保持打開狀態,則可能會爲該文件描述符報告事件。
因此,雖然我沒有自己檢查它,但我猜dup
不允許您以任何方式複製epoll的過濾器列表。 fd
都會引用相同的文件句柄。任何對一個過濾器的更改都會反映在另一個過濾器中。
不幸的是,由於沒有我知道的API來查詢epoll
的過濾器列表,這意味着您無法做到自己想做的事,從一開始就沒有辦法跟蹤。