2016-06-13 79 views
1

是否有方法複製使用epoll_create創建的文件描述符,以便可以獨立修改副本(使用epoll_ctl添加/移除監視的文件描述符)。複製epoll文件描述符

E.g.我創建了一個epoll文件描述符A,它等待文件PQ上的事件。我將它複製到epoll文件描述符B,並使B也等待文件R上的事件。調用epoll_wait(A)仍然只會等待PQ

A上調用dup,或者需要使用epoll_createepoll_ctl重新創建epoll文件描述符時,這是行爲嗎?

回答

0

這有點令人困惑。

當您打開一個新文件時,會創建兩個實體。一個如果文件在內核中處理。另一個是文件描述符,一個引用該文件句柄的數字。

雖然我不確定epoll fd會發生什麼情況,但我認爲它與任何其他重複的fds相同,並且它們是相同的文件句柄。

對於一個暗示,從epoll(2)手冊頁的摘錄可能幫助:

Q6將關閉文件描述符導致它被自動從所有epoll的套去掉?

A6是的,但請注意以下幾點。文件描述符是對打開文件描述的引用(請參閱open(2))。 每當通過dup(2), dup2(2),fcntl(2)F_DUPFDfork(2)複製描述符時,創建引用相同打開文件描述的新文件描述符。一個 開放文件描述繼續存在,直到 指向它的所有文件描述符都已關閉。只有在所有文件描述符參考底層 打開文件描述已關閉(或之前描述符明確使用epoll_ctl(2)EPOLL_CTL_DEL)之後,才從epoll集中刪除文件描述符。
這意味着,即使作爲epoll集的一部分的文件描述符 已關閉,如果涉及相同基礎 文件描述的其他文件 描述符保持打開狀態,則可能會爲該文件描述符報告事件。

因此,雖然我沒有自己檢查它,但我猜dup不允許您以任何方式複製epoll的過濾器列表。 fd都會引用相同的文件句柄。任何對一個過濾器的更改都會反映在另一個過濾器中。

不幸的是,由於沒有我知道的API來查詢epoll的過濾器列表,這意味着您無法做到自己想做的事,從一開始就沒有辦法跟蹤。

0

您可以獨立地在不同的基礎文件結構(或具有不同fd的相同文件結構)上運行重複的epfd。