如果仍然有数据要被读取,那么select()会被调用吗?

时间:2012-06-11 21:25:33

标签: linux sockets select network-programming

如果套接字有要读取的数据并且调用了select()函数,则会选择():

  1. 立即返回,表示插座已准备好阅读,或
  2. 阻止直到在套接字上收到更多数据
  3. ...

2 个答案:

答案 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)),则认为文件描述符已准备就绪。

因此,至少根据手册,如果有任何可用数据,它会立即返回。