【问题标题】:Is it necessary to deregister a socket from epoll before closing it?是否有必要在关闭之前从 epoll 注销套接字?
【发布时间】:2012-02-01 05:12:53
【问题描述】:

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

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

如果套接字随后将被关闭,是否仍然需要调用 epoll_ctl ?还是套接字会因为关闭而被隐式注销?

【问题讨论】:

    标签: linux sockets epoll


    【解决方案1】:

    来自man page

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

    A6 可以,但请注意以下几点。文件描述符是一个 引用打开的文件描述(参见open(2))。每当一个 描述符通过dup(2)、dup2(2)、fcntl(2)F_DUPFDfork(2),一个新的文件描述符,引用同一个打开的文件描述 被建造。一个打开的文件描述继续存在,直到所有文件 引用它的描述符已关闭。文件描述符是 仅在所有引用的文件描述符之后从 epoll 集中删除 基础打开文件描述已关闭(或之前,如果 使用epoll_ctl(2) EPOLL_CTL_DEL) 显式删除描述符。这 意味着即使在属于 epoll 集的文件描述符之后 已关闭,如果其他文件可能会报告该文件描述符的事件 引用相同底层文件描述的描述符保持打开状态。

    【讨论】:

    • 谢谢!我一直在做“man epoll_ctl”、“man epoll_create”寻找答案,但忘记了“man epoll”的摘要手册页。
    • 所以只要没有人用 dup() 复制它并且进程没有分叉,你还好吗?
    • 是的,我认为总结得很好。
    • 然而,情况似乎并非如此。我刚刚写了一个简单的 sn-p,它创建了一个监听套接字,将它添加到一个 epoll,关闭套接字并继续 epoll_wait。它就在那里,如果在两者之间进行了一次骗局并且 del 成功了,它就会触发。
    • @Matt 是的,如果你不close()他们,显然文件描述符不会关闭......
    猜你喜欢
    • 1970-01-01
    • 2014-01-22
    • 1970-01-01
    • 2012-08-30
    • 2019-09-10
    • 2012-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多