一尘不染

在关闭epoll之前是否需要注销套接字?

linux

假定以下代码,其中“ sock”是TCP套接字的句柄,该句柄先前已使用epfd指定的epoll文件描述符注册。

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

如果套接字无论如何都要随后关闭,是否仍然需要调用epoll_ctl?还是由于关闭套接字而隐式注销了套接字?


阅读 362

收藏
2020-06-07

共1个答案

一尘不染

手册页

Q6 关闭文件描述符会导致它自动从所有epoll集中删除吗?

A6
是,但是请注意以下几点。文件描述符是对打开的文件描述的引用(请参阅open(2))。每当通过dup(2),dup2(2),fcntl(2)F_DUPFD
fork(2)复制描述符时,都会创建一个引用相同打开文件描述的新文件描述符。一个打开的文件描述将继续存在,直到所有引用它的文件描述符都被关闭为止。epoll仅在关闭所有引用基础打开文件描述的文件描述符之后(或如果使用epoll_ctl(2)明确删除了描述符之前),才从集合中删除文件描述符EPOLL_CTL_DEL。这意味着即使在文件描述符之后epoll如果set已关闭,则如果引用同一基础文件描述的其他文件描述符保持打开状态,则可能会报告该文件描述符的事件。

2020-06-07