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

时间:2013-06-16 21:14:27

标签: select file-io blocking file-descriptor epoll

我希望C程序在一组文件描述符上阻塞,直到所有文件都准备就绪。这与传统的select(),poll()和epoll()系统调用不同,它们仅在任何文件描述符准备好之前阻塞。是否有标准函数将阻塞,直到所有文件都准备好?或许还有一些其他聪明的技巧?

显然,我可以在循环中调用select()直到所有文件描述符都准备就绪,但我不想承担上下文切换,抢占,迁移等的开销。我宁愿选择( )'任务只是睡眠,直到所有文件都准备好。

1 个答案:

答案 0 :(得分:1)

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

  1. 将轮询集初始化为您感兴趣的所有文件描述符。
  2. poll()用于当前的文件描述符集
  3. poll()返回时,扫描revents并找到所有准备好的文件描述符。从民意调查集中删除它们。
  4. 如果集合中仍有任何文件描述符,请返回步骤2.
  5. poll最后一次使用完整的文件描述符集,以确保它们都已准备就绪。
  6. 如果有些人还没有准备好,请返回第1步。
  7. 成功
  8. 它仍然可能涉及许多poll()次呼叫,但至少它不会忙碌等待。我不认为存在更有效的方式。