假设下面的代码“sock”是一个以前用epfd指定的epoll文件描述符注册的TCP套接字句柄。
epoll_ctl(epfd, EPOLL_CTL_DEL, sock, &ev); close(sock);
是否仍然有必要调用epoll_ctl如果套接字将被closures呢? 还是套接字由于closures而被隐式注销?
从手册页 :
Q6关闭一个文件描述符会自动从所有的epoll集合中删除它吗?
A6是的,但请注意以下几点。 文件描述符是对打开的文件描述的引用(参见
open
(2))。 无论何时通过dup
(2),dup2
(2),fcntl
(2)F_DUPFD
或fork
(2)复制描述符,都会创建一个引用相同的打开文件描述的新文件描述符。 一个打开的文件描述继续存在,直到所有引用它的文件描述符都被关闭。 只有在引用底层打开文件描述的所有文件描述符都被关闭之后(或者在使用epoll_ctl
(2)EPOLL_CTL_DEL
显式移除描述符之前),才会从epoll
集中移除EPOLL_CTL_DEL
。 这意味着,即使已经关闭了作为epoll
集的一部分的文件描述符,如果涉及相同基础文件描述的其他文件描述符保持打开状态,则可以为该文件描述符报告事件。