关闭它之前是否需要从epoll注销套接字?
问题描述:
假设下面的代码,“袜子”是一个句柄到先前通过的epfd指定的epoll的文件描述符注册TCP套接字。关闭它之前是否需要从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_ctl
(2)EPOLL_CTL_DEL
明确删除 描述符)之后,才从epoll
集中删除文件描述符 。这 意味着即使这是一个epoll
集的一部分已经 被关闭文件描述符之后,事件可能会报告该文件描述,如果其他文件 描述指的是相同的基础文件描述继续开放。
谢谢!我一直在做“man epoll_ctl”,“man epoll_create”寻找答案,但忘记了“man epoll”的摘要手册页。 – selbie 2012-01-03 07:15:44
所以没有人用dup()重复它,并且该过程没有分叉,你没事吧? – MarkR 2012-01-04 16:14:43
是的,我认为这很好。 – 2012-01-04 16:16:58