2012-01-03 67 views
12

假設下面的代碼,「襪子」是一個句柄到先前通過的epfd指定的epoll的文件描述符註冊TCP套接字。關閉它之前是否需要從epoll註銷套接字?

epoll_ctl(epfd, EPOLL_CTL_DEL, sock, &ev); 
close(sock); 

是否仍然需要調用epoll_ctl如果套接字隨後會被關閉?或者由於關閉它而導致套接字隱式地取消註冊?

回答

22

man page

Q6將關閉文件描述符導致它從所有epoll的去除設置 自動?

A6是的,但要注意以下點。文件描述符是對打開的文件描述的引用 (請參閱open(2))。每當一個 描述符被複制經由dup(2),dup2(2),fcntl(2)F_DUPFD,或者 fork(2),則創建一個新的文件描述符指相同的打開文件描述 。一直打開的文件描述一直存在,直到所有涉及它的文件描述符都被關閉。只有在所有涉及 的文件描述符已關閉(或之前使用epoll_ctl(2)EPOLL_CTL_DEL明確刪除 描述符)之後,才從epoll集中刪除文件描述符 。這 意味着即使這是一個epoll集的一部分已經 被關閉文件描述符之後,事件可能會報告該文件描述,如果其他文件 描述指的是相同的基礎文件描述繼續開放。

+0

謝謝!我一直在做「man epoll_ctl」,「man epoll_create」尋找答案,但忘記了「man epoll」的摘要手冊頁。 – selbie 2012-01-03 07:15:44

+0

所以沒有人用dup()重複它,並且該過程沒有分叉,你沒事吧? – MarkR 2012-01-04 16:14:43

+0

是的,我認爲這很好。 – 2012-01-04 16:16:58

相關問題