Epoll或Kqueue能够处理文件描述符的异步添加吗?

3
如果一个线程(比如X)正在等待epoll_wait(),另一个线程(比如Y)是否可以调用epoll_ctl()来注册文件描述符9的兴趣。在线程X中,之前对epoll_wait()的调用是否会返回由线程Y添加的文件描述符9?初始对epoll_wait()的调用从未在任何时候中途返回。
现在我想将此与操作系统中的另外两个轮询调用进行比较,并提出相关问题。 poll()kqueue
  1. 如果上述问题的答案是正确的,则是否有办法使用poll()系统调用实现类似的行为?
  2. 假设epoll_ctl()是线程安全的,线程X可以安全地调用epoll_ctl()并使调用epoll_wait()返回文件描述符9是否准备好进行I/O。将声明对文件描述符的兴趣和等待函数分离是使该函数令人惊奇的原因。但是,人们经常将kqueueepoll用于相同的功能。但是,kqueue没有单独的函数来声明对获取描述符事件反馈的兴趣。是否有人知道如何使用kqueue以类似于epoll的方式?如果它允许线程安全的“兴趣声明”,则epoll似乎是目前最好的线程安全选项。

1
使用 kqueue 时,您可以通过将 nevents 参数传递为 0 来声明兴趣而不获取事件反馈。例如,请参见此答案 - Tsyvarev
1个回答

3

来自man epoll_wait:

当一个线程被阻塞在调用epoll_pwait()时,另一个线程可以向被等待的epoll实例添加文件描述符。如果新文件描述符准备就绪,它将导致epoll_wait()调用取消阻塞。

因此,epoll_wait会在等待期间监视添加的文件描述符。

这种行为无法通过poll()/select()实现,因为它们一次性读取文件描述符集合,所以无法修改当前正在轮询的文件描述符集合。

[当然,如果您将由epoll_create创建的文件描述符传递给

poll()/select(),则会像epoll_wait一样跟踪对该文件描述符的修改。]


我之前不知道有epoll_pwait这个函数。epoll_wait()epoll_pwait()有什么区别? - Curious
1
嗯,看起来man页上有个错误:在同一句中使用了epoll_pwaitepoll_wait,实际上它们指的是同一个函数。epoll_pwaitepoll_wait的区别在于它在执行期间还允许给定信号集。详细信息请参阅man页。 - Tsyvarev
epoll_pwait 不是打印错误,它是 epoll_wait 的一种变体,允许管理安全信号处理。在此处阅读更多信息:http://linux.die.net/man/2/epoll_pwait。 - Myst
1
@Myst:我知道epoll_pwait的存在。笔误在于在引用说明中同时使用epoll_wait和这个函数:“当一个线程被阻塞在...epoll_pwait...时,它会导致epoll_wait解除阻塞”。对于不同的函数,这个说明就没有意义了。 - Tsyvarev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接