【问题标题】:Why epoll_wait() doesn't react on dup2(writable_fd, non_writable_fd)?为什么 epoll_wait() 对 dup2(writable_fd, non_writable_fd) 没有反应?
【发布时间】:2015-01-14 16:50:58
【问题描述】:

假设我将不可写的 fd 添加到 epoll watcher 以等待它何时变为可写。

epoll_ctl(epollfd, EPOLL_CTL_ADD, non_writable_fd, {EPOLLOUT})

non_writable_fd 仍然不可写,epoll_wait 将返回 0 就绪 fds

那我就做这个

dup2(writable_fd, non_writable_fd)

writable_fd 是一个可写的文件描述符。现在我期待epoll_wait 会立即返回 1 fd。但不幸的是,它仍然超时并返回 0 fd。

为什么当它与selectpoll 一起使用时,这种技术却不适用于epoll

【问题讨论】:

    标签: linux epoll dup2


    【解决方案1】:

    问题在于epoll 关心的是“打开文件描述”,而不是文件描述符。答案隐藏在几层手册页中。一、epoll_wait

    关闭一个文件描述符会导致它被从所有epoll中移除 自动设置

    是的,但请注意以下几点。一份文件 描述符是对打开文件描述的引用(参见 打开(2))[...]

    回到您的dup2 电话:

    dup2(writable_fd, non_writable_fd)
    

    dup2 原子调用首先关闭non_writable_fd,然后使其指向与writable_fd 相同的文件描述。考虑两种情况:

    1. 你没有做任何特别的事情,所以你的dup2 最终关闭了与non_writable_fd 关联的打开文件描述。在这种情况下,epoll 只需将其从集合中移除即可

    2. 你之前有 dup'd non_writable_fd 进入别的东西。在这种情况下,dup2 只是切断了non_writable_fd 与其 OFD 之间的关联,它继续存在,由epoll 观看

    在这两种情况下,您的 dup 调用都无法达到您想要的效果:您需要再次显式调用 epoll_ctl

    【讨论】:

    • 对!但我认为它们被称为打开文件描述或简称OFD。你错过了 open 部分。
    • @rodrigo 谢谢!随意编辑(或者我可以,在几分钟内)。
    猜你喜欢
    • 1970-01-01
    • 2018-01-01
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-10
    • 2019-08-17
    相关资源
    最近更新 更多