让我想象一下,我向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仍然超时。
为什么当epoll
与select
合作时,此技术无法与poll
一起使用?
答案 0 :(得分:2)
问题是epoll
关心“打开文件描述”,而不关心文件描述符。答案隐藏在几层手册页中。首先,epoll_wait
:
关闭文件描述符会导致它从所有epoll中被删除 自动设置?
是,但要注意以下几点。一份文件 descriptor是对打开文件描述的引用(请参阅 开放(2))[...]
返回dup2
来电:
dup2(writable_fd, non_writable_fd)
dup2
以原子方式调用首先关闭non_writable_fd
,然后使其指向与writable_fd
相同的文件描述。考虑2个案例:
您没有做任何特别的事情,因此您的dup2
最终会关闭与non_writable_fd
相关联的打开文件说明。在这种情况下,epoll
只是将其从集合中删除,那就是
您事先已将dup
'd non_writable_fd
转换为其他内容。在这种情况下,dup2
只会切断non_writable_fd
与其生存的OFD之间的关联,由epoll
在这两种情况下,dup
来电无法实现您的目标:您需要再次明确呼叫epoll_ctl
。