假设有以下代码,其中“sock”是之前已经在由epfd指定的epoll文件描述符中注册过的TCP套接字句柄。
epoll_ctl(epfd, EPOLL_CTL_DEL, sock, &ev);
close(sock);
如果套接字随后会被关闭,是否仍然需要调用 epoll_ctl?或者关闭套接字会自动解除注册吗?
从手册页面:
Q6 关闭文件描述符会自动从所有 epoll 集合中删除吗?
A6 是的,但需要注意以下几点。 文件描述符是对打开的文件描述符的引用(请参见
open
(2))。每当一个描述符通过dup
(2),dup2
(2),fcntl
(2)F_DUPFD
或fork
(2) 进行复制时,都会创建一个指向相同打开文件描述符的新文件描述符。只有在所有指向它的文件描述符已关闭后,打开的文件描述符才会继续存在。仅当所有指向基础打开文件描述符的文件描述符已关闭(或在使用epoll_ctl
(2)EPOLL_CTL_DEL
明确删除描述符之前)才会从epoll
集合中删除文件描述符。这意味着即使已关闭作为epoll
集合一部分的文件描述符,如果其他指向相同底层文件描述符的文件描述符仍保持打开状态,则仍可能报告该文件描述符的事件。
close()
函数来关闭文件描述符,显然它们就不会关闭。 - Will