是否有一种方法可以复制使用epoll_create创建的文件描述符,以便可以独立地修改副本(使用epoll_ctl添加/删除监视的文件描述符)。
例如,我创建了一个epoll文件描述符A,它等待文件P和Q上的事件。我将其复制到epoll文件描述符B,并使B也等待文件R上的事件。调用epoll_wait(A)仍然只能等待P和Q。
这是在A上调用A时的行为,还是需要使用epoll_create和epoll_ctl重新创建epoll文件描述符?
发布于 2016-06-13 11:28:59
这有点让人困惑。
打开新文件时,将创建两个实体。一个,如果文件句柄在内核中。另一个是文件描述符,一个引用该文件句柄的数字。
虽然我不确定epoll fd会发生什么,但我假设它与任何其他重复的fds相同,即它们是相同的文件句柄。
有关这方面的提示,epoll(2)手册页的这段摘录可能会有所帮助:
Q6将关闭文件描述符,使其自动从所有epoll设置中删除? A6是的,但是要注意以下几点。文件描述符是对打开的文件描述的引用(请参阅
open(2))。每当通过dup(2)、dup2(2)、fcntl(2)F_DUPFD或fork(2)复制描述符时,就会创建引用相同的打开文件描述的新文件描述符。打开的文件描述一直存在,直到引用它的所有文件描述符都关闭为止。只有在所有引用基础打开文件描述的文件描述符都已关闭之后(或者在使用epoll_ctl(2)EPOLL_CTL_DEL显式删除描述符之前),才会从epoll集中删除文件描述符。 这意味着,即使关闭了作为epoll集一部分的文件描述符,如果引用相同基础文件描述的其他文件描述符仍处于打开状态,则可能会报告该文件描述符的事件。
因此,虽然我没有亲自检查它,但我猜想dup将不允许您以任何方式复制epoll的筛选列表。两个fd都将引用相同的文件句柄。对一个过滤器所做的任何更改都将反映在另一个过滤器中。
不幸的是,由于没有我所知道的API来查询epoll的筛选列表,这意味着你没有办法做你想做的事情,除非从一开始就跟踪。
发布于 2016-10-22 12:41:59
您可以独立地在不同的基础文件结构(或具有不同fd的相同文件结构)上操作重复的epfd。
https://stackoverflow.com/questions/37787619
复制相似问题