如果一个socket有数据要读取并且调用了select()函数,会select():
- 立即返回,表示套接字已准备好读取,或
- 阻塞直到在套接字上接收到更多数据
??
如果一个socket有数据要读取并且调用了select()函数,会select():
??
它可以很容易地进行测试,但我向您保证,如果在其中一个 readfd 上已经有数据可供读取,则 select() 将永远不会阻塞。如果在这种情况下它确实阻塞了,那么它对于使用非阻塞 I/O 进行编程就不是很有用了。以您在 select() 上循环的示例为例,您会看到要读取的数据,然后您就读取了它。然后,当您处理读取的数据时,会有更多数据进入。当您返回 select() 时,它会阻塞,等待更多数据。但是,连接另一端的对等方正在等待对已发送数据的响应。您的程序最终会永远阻塞。您可以通过超时等来解决它,但重点是提高非阻塞 I/O 的效率。
如果 fd 在 EOF,即使多次调用 select() 也永远不会阻塞。
man 2 select
似乎很直接地回答了这个问题:
select() 和 pselect() 允许程序监视多个文件描述符,等待一个或多个文件描述符“准备好”用于某种类型的 I/O 操作(例如,可能的输入)。如果可以在没有阻塞的情况下执行相应的 I/O 操作(例如 read(2)),则认为文件描述符已准备就绪。
因此,至少根据手册,如果有任何可用数据,它将立即返回。