为什么epoll_wait()不对dup2做出反应(writable_fd,non_writable_fd)?

时间:2015-01-14 16:50:59

标签: linux epoll dup2

让我想象一下,我向epoll观察者添加了不可写的fd,等待它变得可写。

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

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

然后我会做这个

dup2(writable_fd, non_writable_fd)

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

为什么当epollselect合作时,此技术无法与poll一起使用?

1 个答案:

答案 0 :(得分:2)

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

  

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

     

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

返回dup2来电:

dup2(writable_fd, non_writable_fd)

dup2以原子方式调用首先关闭non_writable_fd,然后使其指向与writable_fd相同的文件描述。考虑2个案例:

  1. 您没有做任何特别的事情,因此您的dup2最终会关闭与non_writable_fd相关联的打开文件说明。在这种情况下,epoll只是将其从集合中删除,那就是

  2. 您事先已将dup'd non_writable_fd转换为其他内容。在这种情况下,dup2只会切断non_writable_fd与其生存的OFD之间的关联,由epoll

  3. 观看

    在这两种情况下,dup来电无法实现您的目标:您需要再次明确呼叫epoll_ctl