1

我的情况是,我希望 C 程序阻塞一组文件描述符,直到所有文件都准备好。这不同于传统的 select()、poll() 和 epoll() 系统调用,它们只会阻塞直到任何文件描述符准备好。是否有一个标准功能会阻塞,直到所有文件都准备好?或者也许还有其他一些巧妙的技巧?

显然,我可以循环调用 select(),直到所有文件描述符都准备好,但我不想招致上下文切换、抢占、迁移等的开销。我宁愿 select()'ing任务只是休眠,直到所有文件都准备好。

4

1 回答 1

1

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

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

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

于 2013-06-17T03:31:44.330 回答