1

如果一个socket有数据要读取并且调用了select()函数,会select():

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

??

4

2 回答 2

2

它可以很容易地进行测试,但我向您保证,如果在其中一个 readfd 上已经有数据可供读取,则 select() 将永远不会阻塞。如果在这种情况下它确实阻塞了,那么它对于使用非阻塞 I/O 进行编程就不是很有用了。以您在 select() 上循环的示例为例,您会看到要读取的数据,然后您就读取了它。然后,当您处理读取的数据时,会有更多数据进入。当您返回 select() 时,它会阻塞,等待更多数据。但是,连接另一端的对等方正在等待对已发送数据的响应。您的程序最终会永远阻塞。您可以通过超时等来解决它,但重点是提高非阻塞 I/O 的效率。

如果 fd 在 EOF,即使多次调用 select() 也永远不会阻塞。

于 2012-06-11T23:25:41.873 回答
1

man 2 select似乎很直接地回答了这个问题:

select() 和 pselect() 允许程序监视多个文件描述符,等待一个或多个文件描述符“准备好”用于某种类型的 I/O 操作(例如,可能的输入)。如果可以在没有阻塞的情况下执行相应的 I/O 操作(例如 read(2)),则认为文件描述符已准备就绪。

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

于 2012-06-11T21:31:23.193 回答