让我们想象一下,我在epoll观察者中添加了不可写的fd,等待它何时变为可写的。
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将立即返回1FD。但不幸的是,它仍然超时,0FD返回。
为什么这一技术在与epoll和poll一起工作时不适用于
发布于 2015-01-14 17:02:25
问题是,epoll关心的是“打开的文件描述”,而不是文件描述符。答案隐藏在几层手册页中。首先,epoll_wait
关闭文件描述符会导致从所有epoll设置中自动删除吗? 是,但是要注意以下几点。文件描述符是对打开的文件描述的引用(请参见打开(2)).
回到您的dup2电话:
dup2(writable_fd, non_writable_fd)dup2调用首先自动关闭non_writable_fd,然后将其指向与writable_fd相同的文件描述。审议2起案件:
dup2最终关闭了与non_writable_fd相关的打开文件描述。在本例中,epoll只是将其从集合中移除,这就是dup non_writable_fd只是简单地切断了non_writable_fd和它的OFD之间的联系,后者还在继续,由epoll观看。在这两种情况下,您的dup调用都没有达到您想要的目的:您需要再次显式地调用epoll_ctl。
https://stackoverflow.com/questions/27948251
复制相似问题