假定以下代码,其中“ sock”是TCP套接字的句柄,该句柄先前已使用epfd指定的epoll文件描述符注册。
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仅在关闭所有引用基础打开文件描述的文件描述符之后(或如果使用epoll_ctl(2)明确删除了描述符之前),才从集合中删除文件描述符EPOLL_CTL_DEL。这意味着即使在文件描述符之后epoll如果set已关闭,则如果引用同一基础文件描述的其他文件描述符保持打开状态,则可能会报告该文件描述符的事件。
Q6 关闭文件描述符会导致它自动从所有epoll集中删除吗?
A6 是,但是请注意以下几点。文件描述符是对打开的文件描述的引用(请参阅open(2))。每当通过dup(2),dup2(2),fcntl(2)F_DUPFD或 fork(2)复制描述符时,都会创建一个引用相同打开文件描述的新文件描述符。一个打开的文件描述将继续存在,直到所有引用它的文件描述符都被关闭为止。epoll仅在关闭所有引用基础打开文件描述的文件描述符之后(或如果使用epoll_ctl(2)明确删除了描述符之前),才从集合中删除文件描述符EPOLL_CTL_DEL。这意味着即使在文件描述符之后epoll如果set已关闭,则如果引用同一基础文件描述的其他文件描述符保持打开状态,则可能会报告该文件描述符的事件。
open
dup
dup2
fcntl
F_DUPFD
fork
epoll
epoll_ctl
EPOLL_CTL_DEL