c-重复epoll文件描述符



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

例如,我创建一个epoll文件描述符A,它等待文件PQ上的事件。我将其复制到epoll文件描述符B,并使B也等待文件R上的事件。呼叫CCD_ 9仍将仅等待CCD_ 10和CCD_。

这是在A上调用dup时的行为,还是需要使用epoll_createepoll_ctl重新创建epoll文件描述符?

这有点令人困惑。

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

虽然我不确定epoll-fd会发生什么,但我假设它与任何其他重复的fd相同,即它们是相同的文件句柄。

关于这一点,epoll(2)手册页的摘录可能会有所帮助:

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

A6是的,但要注意以下几点。文件描述符是对打开文件描述的引用(参见open(2))。每当描述符经由CCD_ 18被复制时,dup2(2)fcntl(2)F_DUPFDfork(2),创建引用相同打开文件描述的新文件描述符。一打开的文件描述继续存在,直到所有引用它的文件描述符都已关闭。只有在所有文件之后,才会从epoll集中删除文件描述符引用底层的描述符打开的文件描述已经关闭(或者如果使用epoll_ctl(2)EPOLL_CTL_DEL显式删除描述符,则在此之前)
这意味着即使在文件之后作为epoll集一部分的描述符已关闭,如果其他文件引用相同底层的描述符文件描述保持打开状态。

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

不幸的是,由于我所知道的没有API来查询epoll的过滤器列表,这意味着你没有办法做你想做的事情,除了从一开始就跟踪。

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

相关内容

  • 没有找到相关文章

最新更新