在关闭它之前是否有必要从epoll中取消注册套接字?

sel*_*bie 20 sockets linux epoll

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

epoll_ctl(epfd, EPOLL_CTL_DEL, sock, &ev);
close(sock);
Run Code Online (Sandbox Code Playgroud)

如果套接字随后会被关闭,是否仍然需要调用epoll_ctl?或者套接字是否因为关闭而被隐式取消注册?

Fré*_*idi 30

手册页:

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

A6 是的,但要注意以下几点.文件描述符是对打开文件描述的引用(参见open(2)).每当通过dup(2),dup2(2),fcntl(2)F_DUPFDfork(2)复制描述符时,创建引用相同打开文件描述的新文件描述符.打开的文件描述将继续存在,直到引用它的所有文件描述符都已关闭.epoll仅在引用基础打开文件描述的所有文件描述符都已关闭之后(或者在使用epoll_ctl(2)显式删除描述符之前),才从集合中删除文件描述符EPOLL_CTL_DEL.这意味着即使在作为epoll集合的一部分的文件描述符已经关闭之后,如果引用相同底层文件描述的其他文件描述符保持打开,则可以报告该文件描述符的事件.

  • @Matt是的,显然如果你不“close()”文件描述符就不会关闭它们...... (3认同)
  • 谢谢!我一直在执行“man epoll_ctl”、“man epoll_create”寻找答案,但忘记了“man epoll”的摘要手册页。 (2认同)
  • 然而,情况似乎并非如此。我刚刚编写了一个简单的代码片段,它创建了一个监听套接字,将其添加到 epoll,关闭套接字并继续执行 epoll_wait。它就在那里,如果中间发生了一次骗局并且德尔成功了,它就会被触发。 (2认同)