我是 C 和 I/O 多路复用的新手,只是一个关于select()
.
根据手册页select()
: 允许程序监视多个文件描述符,等待至少或多个文件描述符“准备好”用于某些类的 I/O 操作。返回值是就绪描述符的计数。我对返回值有点困惑。
因此,假设一个并发 Web 服务器使用select()
,并且有 2 个客户端(连接文件描述符)连接到服务器。如果客户端 A 正在写 sth 而客户端 B 还没有写,当然select()
返回 1 并修改fdset
.
但是我看到了一些代码,select()
它可以在多个文件描述符准备好时返回,这意味着select()
可以返回 2,3,....等。
这是我的问题:
据我了解,select()
当一个 fd 可用以避免阻塞时应尽快返回,因此如果select()
可以检测到多个 fd,并考虑每个 fd 不会同时准备好(例如第一个 fd 在 1.0s 准备好第二个是准备好 1.1s,它们不能都在 1.0s 准备好),那么如何select()
知道当第一个 fd 准备好时它遇到时,它不应该立即返回,而是等到下一个 fd 准备好?既然select()
无法预测,它怎么知道会有第二个准备好的fd?
或者
的底层机制select()
是,它被阻塞直到第一个 fd 准备好,然后它等待一个预定义的时间以确保它可以在超时之前捕获其他读取的 fd,这样select()
至少可以返回 1?