epoll或kqueue是否可以处理向其自身异步添加文件描述符

Can epoll or kqueue handle asynchronous additions of file descriptors to itself

本文关键字:异步 添加 文件 描述 kqueue 是否 处理 epoll      更新时间:2023-10-16

如果一个线程(比如X)正在等待epoll_wait(),那么另一个线程可以调用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允许线程安全的"兴趣声明",那么它似乎是目前最好的线程安全选项

来自man epoll_wait:

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

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

poll()/select()无法实现这种行为,因为它们读取一次文件描述符集,因此无法修改当前轮询的文件描述符集。

[当然,如果您将epoll_create创建的文件描述符传递给poll()/select(),则会像epoll_wait一样跟踪此文件描述符的修改。]