是否有方法复制使用epoll_create
创建的文件描述符,以便可以独立修改副本(使用epoll_ctl
添加/删除监视的文件描述符)。
例如,我创建一个epoll文件描述符A
,它等待文件P
和Q
上的事件。我将其复制到epoll文件描述符B
,并使B
也等待文件R
上的事件。呼叫CCD_ 9仍将仅等待CCD_ 10和CCD_。
这是在A
上调用dup
时的行为,还是需要使用epoll_create
和epoll_ctl
重新创建epoll文件描述符?
这有点令人困惑。
打开新文件时,将创建两个实体。如果内核中的文件句柄为1。另一个是文件描述符,一个引用该文件句柄的数字。
虽然我不确定epoll-fd会发生什么,但我假设它与任何其他重复的fd相同,即它们是相同的文件句柄。
关于这一点,epoll(2)
手册页的摘录可能会有所帮助:
Q6关闭文件描述符会自动将其从所有epoll集中删除吗?
A6是的,但要注意以下几点。文件描述符是对打开文件描述的引用(参见
open(2)
)。每当描述符经由CCD_ 18被复制时,dup2(2)
、fcntl(2)
、F_DUPFD
或fork(2)
,创建引用相同打开文件描述的新文件描述符。一打开的文件描述继续存在,直到所有引用它的文件描述符都已关闭。只有在所有文件之后,才会从epoll集中删除文件描述符引用底层的描述符打开的文件描述已经关闭(或者如果使用epoll_ctl(2)
EPOLL_CTL_DEL
显式删除描述符,则在此之前)
这意味着即使在文件之后作为epoll集一部分的描述符已关闭,如果其他文件引用相同底层的描述符文件描述保持打开状态。
所以,虽然我自己还没有检查过,但我猜dup
不会允许您以任何方式复制epoll的筛选器列表。两个fd
将引用相同的文件句柄。对其中一个过滤器所做的任何更改都将反映在另一个过滤器中。
不幸的是,由于我所知道的没有API来查询epoll
的过滤器列表,这意味着你没有办法做你想做的事情,除了从一开始就跟踪。
您可以在不同的底层文件结构(或具有不同fd的同一文件结构)上独立操作重复的epfd。