如何阻止直到所有文件描述符都准备好?是否使用select()/poll()/epoll()?

如何阻止直到所有文件描述符都准备好?是否使用select()/poll()/epoll()?,select,file-io,blocking,file-descriptor,epoll,Select,File Io,Blocking,File Descriptor,Epoll,我想让一个C程序在一组文件描述符上阻塞,直到所有文件都准备好。这与传统的select()、poll()和epoll()系统调用不同,后者只在任何文件描述符准备就绪之前阻塞。是否有一个标准函数将阻止,直到所有文件都准备好?或许还有其他一些聪明的把戏 显然,我可以在循环中调用select(),直到所有文件描述符都准备好,但我不想引起上下文切换、抢占、迁移等开销。。我希望select()ing任务在所有文件准备就绪之前一直处于休眠状态。如果有其他线程同时在某些相同的文件描述符上运行(但您可能无论如何都

我想让一个C程序在一组文件描述符上阻塞,直到所有文件都准备好。这与传统的select()、poll()和epoll()系统调用不同,后者只在任何文件描述符准备就绪之前阻塞。是否有一个标准函数将阻止,直到所有文件都准备好?或许还有其他一些聪明的把戏


显然,我可以在循环中调用select(),直到所有文件描述符都准备好,但我不想引起上下文切换、抢占、迁移等开销。。我希望select()ing任务在所有文件准备就绪之前一直处于休眠状态。

如果有其他线程同时在某些相同的文件描述符上运行(但您可能无论如何都不应该这样做),则它不是线程安全的,但您可以尝试以下方法:

  • 将轮询集初始化为您感兴趣的所有文件描述符
  • poll()
    用于当前文件描述符集
  • poll()
    返回时,扫描
    revents
    并找到所有准备就绪的文件描述符。从轮询集中删除它们
  • 如果集合中还有任何文件描述符,请返回步骤2
  • poll
    使用全套文件描述符进行最后一次轮询,以确保它们仍然准备就绪
  • 如果有些人还没有准备好,请返回步骤1
  • 成功

  • 它仍然可能涉及许多
    poll()
    调用,但至少它不会忙着等待。我认为没有更有效的方法。

    如果有其他线程同时在某些相同的文件描述符上运行(但您可能无论如何都不应该这样做),那么它不是线程安全的,但您可以尝试以下方法:

  • 将轮询集初始化为您感兴趣的所有文件描述符
  • poll()
    用于当前文件描述符集
  • poll()
    返回时,扫描
    revents
    并找到所有准备就绪的文件描述符。从轮询集中删除它们
  • 如果集合中还有任何文件描述符,请返回步骤2
  • poll
    使用全套文件描述符进行最后一次轮询,以确保它们仍然准备就绪
  • 如果有些人还没有准备好,请返回步骤1
  • 成功

  • 它仍然可能涉及许多
    poll()
    调用,但至少它不会忙着等待。我认为没有比这更有效的方法了。

    是的,这就是我所说的循环。我已经研究过扩展Linux内核来做我想做的事情,但这看起来是一项非常艰巨的工作,因为文件编写线程需要做一些工作来确定是否应该唤醒线程。是的,这就是我所说的循环。我已经研究过扩展Linux内核以实现我想要的功能,但这看起来是一项非常艰巨的工作,因为文件编写线程需要做一些工作来确定是否应该唤醒线程。