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