【发布时间】:2012-02-01 05:12:53
【问题描述】:
假设以下代码,其中“sock”是 TCP 套接字的句柄,该句柄先前使用 epfd 指定的 epoll 文件描述符注册。
epoll_ctl(epfd, EPOLL_CTL_DEL, sock, &ev);
close(sock);
如果套接字随后将被关闭,是否仍然需要调用 epoll_ctl ?还是套接字会因为关闭而被隐式注销?
【问题讨论】:
假设以下代码,其中“sock”是 TCP 套接字的句柄,该句柄先前使用 epfd 指定的 epoll 文件描述符注册。
epoll_ctl(epfd, EPOLL_CTL_DEL, sock, &ev);
close(sock);
如果套接字随后将被关闭,是否仍然需要调用 epoll_ctl ?还是套接字会因为关闭而被隐式注销?
【问题讨论】:
来自man page:
Q6 关闭一个文件描述符会导致它从所有 epoll 集中移除 自动?
A6 可以,但请注意以下几点。文件描述符是一个 引用打开的文件描述(参见
open(2))。每当一个 描述符通过dup(2)、dup2(2)、fcntl(2)F_DUPFD或fork(2),一个新的文件描述符,引用同一个打开的文件描述 被建造。一个打开的文件描述继续存在,直到所有文件 引用它的描述符已关闭。文件描述符是 仅在所有引用的文件描述符之后从epoll集中删除 基础打开文件描述已关闭(或之前,如果 使用epoll_ctl(2)EPOLL_CTL_DEL) 显式删除描述符。这 意味着即使在属于epoll集的文件描述符之后 已关闭,如果其他文件可能会报告该文件描述符的事件 引用相同底层文件描述的描述符保持打开状态。
【讨论】:
close()他们,显然文件描述符不会关闭......