12
假設下面的代碼,「襪子」是一個句柄到先前通過的epfd指定的epoll的文件描述符註冊TCP套接字。關閉它之前是否需要從epoll註銷套接字?
epoll_ctl(epfd, EPOLL_CTL_DEL, sock, &ev);
close(sock);
是否仍然需要調用epoll_ctl如果套接字隨後會被關閉?或者由於關閉它而導致套接字隱式地取消註冊?
假設下面的代碼,「襪子」是一個句柄到先前通過的epfd指定的epoll的文件描述符註冊TCP套接字。關閉它之前是否需要從epoll註銷套接字?
epoll_ctl(epfd, EPOLL_CTL_DEL, sock, &ev);
close(sock);
是否仍然需要調用epoll_ctl如果套接字隨後會被關閉?或者由於關閉它而導致套接字隱式地取消註冊?
從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
集的一部分已經 被關閉文件描述符之後,事件可能會報告該文件描述,如果其他文件 描述指的是相同的基礎文件描述繼續開放。
謝謝!我一直在做「man epoll_ctl」,「man epoll_create」尋找答案,但忘記了「man epoll」的摘要手冊頁。 – selbie 2012-01-03 07:15:44
所以沒有人用dup()重複它,並且該過程沒有分叉,你沒事吧? – MarkR 2012-01-04 16:14:43
是的,我認爲這很好。 – 2012-01-04 16:16:58