是否有办法复制使用epoll_ctl
创建的文件描述符,以便可以独立修改副本(使用A
添加/删除监视文件描述符)。
E.g。我创建了一个epoll文件描述符P
,它等待文件Q
和B
上的事件。我将其复制到epoll文件描述符B
,并使R
也等待文件epoll_wait(A)
上的事件。致电P
仍然只会等待Q
和dup
。
这是在A
上调用epoll_create
时的行为,还是需要使用epoll_ctl
和{{1}}重新创建epoll文件描述符?
答案 0 :(得分:0)
这有点令人困惑。
打开新文件时,会创建两个实体。一个如果内核中的文件句柄。另一个是文件描述符,一个引用该文件句柄的数字。
虽然我不确定epoll fd会发生什么,但我认为它与任何其他重复的fds相同,那就是它们是相同的文件句柄。
有关提示,请参阅epoll(2)
手册页中的摘录可能会有所帮助:
Q6 关闭文件描述符会导致它自动从所有epoll集中删除吗?
A6 是的,但请注意以下几点。文件描述符是对打开文件描述的引用(请参阅
open(2)
)。 每当通过dup(2)
复制描述符时,dup2(2)
,fcntl(2)
F_DUPFD
或fork(2)
创建了一个引用相同打开文件描述的新文件描述符。一个 打开文件描述继续存在,直到 引用它的所有文件描述符都已关闭。仅在所有文件之后从epoll集中删除文件描述符 描述者指的是底层证据 已打开文件描述(或者在使用epoll_ctl(2)
EPOLL_CTL_DEL
明确删除描述符之前) 这意味着即使在一个文件之后 作为epoll集的一部分的描述符已经关闭,如果是其他文件,则可以报告该文件描述符的事件 描述符指的是相同的底层证据 文件描述仍然开放。
所以,虽然我自己没有检查过,但我猜测dup
不允许你以任何方式复制epoll的过滤列表。 fd
两个都将引用相同的文件句柄。对一个进行的任何过滤器更改都将反映在另一个中。
不幸的是,由于我不知道查询epoll
过滤器列表的API,这意味着您无法按照自己的意愿行事,而无法跟踪一开始。
答案 1 :(得分:0)
您可以独立地在不同的底层文件结构(或具有不同fd的相同文件结构)上操作重复的epfd。