2012-01-03 101 views
12

假设下面的代码,“袜子”是一个句柄到先前通过的epfd指定的epoll的文件描述符注册TCP套接字。关闭它之前是否需要从epoll注销套接字?

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

是否仍然需要调用epoll_ctl如果套接字随后会被关闭?或者由于关闭它而导致套接字隐式地取消注册?

回答

22

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集的一部分已经 被关闭文件描述符之后,事件可能会报告该文件描述,如果其他文件 描述指的是相同的基础文件描述继续开放。

+0

谢谢!我一直在做“man epoll_ctl”,“man epoll_create”寻找答案,但忘记了“man epoll”的摘要手册页。 – selbie 2012-01-03 07:15:44

+0

所以没有人用dup()重复它,并且该过程没有分叉,你没事吧? – MarkR 2012-01-04 16:14:43

+0

是的,我认为这很好。 – 2012-01-04 16:16:58

相关问题