复制epoll文件描述符

时间:2016-06-13 10:40:29

标签: c linux file-descriptor epoll dup

是否有办法复制使用epoll_ctl创建的文件描述符,以便可以独立修改副本(使用A添加/删除监视文件描述符)。

E.g。我创建了一个epoll文件描述符P,它等待文件QB上的事件。我将其复制到epoll文件描述符B,并使R也等待文件epoll_wait(A)上的事件。致电P仍然只会等待Qdup

这是在A上调用epoll_create时的行为,还是需要使用epoll_ctl和{{1}}重新创建epoll文件描述符?

2 个答案:

答案 0 :(得分:0)

这有点令人困惑。

打开新文件时,会创建两个实体。一个如果内核中的文件句柄。另一个是文件描述符,一个引用该文件句柄的数字。

虽然我不确定epoll fd会发生什么,但我认为它与任何其他重复的fds相同,那就是它们是相同的文件句柄。

有关提示,请参阅epoll(2)手册页中的摘录可能会有所帮助:

  

Q6 关闭文件描述符会导致它自动从所有epoll集中删除吗?

     

A6 是的,但请注意以下几点。文件描述符是对打开文件描述的引用(请参阅open(2))。   每当通过dup(2)复制描述符时,              dup2(2)fcntl(2) F_DUPFDfork(2)创建了一个引用相同打开文件描述的新文件描述符。一个   打开文件描述继续存在,直到              引用它的所有文件描述符都已关闭。仅在所有文件之后从epoll集中删除文件描述符   描述者指的是底层证据              已打开文件描述(或者在使用epoll_ctl(2) EPOLL_CTL_DEL明确删除描述符之前)   这意味着即使在一个文件之后              作为epoll集的一部分的描述符已经关闭,如果是其他文件,则可以报告该文件描述符的事件   描述符指的是相同的底层证据              文件描述仍然开放。

所以,虽然我自己没有检查过,但我猜测dup不允许你以任何方式复制epoll的过滤列表。 fd两个都将引用相同的文件句柄。对一个进行的任何过滤器更改都将反映在另一个中。

不幸的是,由于我不知道查询epoll过滤器列表的API,这意味着您无法按照自己的意愿行事,而无法跟踪一开始。

答案 1 :(得分:0)

您可以独立地在不同的底层文件结构(或具有不同fd的相同文件结构)上操作重复的epfd。