Ruby:输出数组参数中的每个IO流都会导致IO.select不等待。

时间:2018-09-23 15:41:11

标签: ruby

我有一台Linux计算机(IP:10.0.0.33),在其中运行netcat作为4444端口的侦听器。我还有一台Windows 10计算机,该计算机使用TCPSocket类连接到Linux计算机。

我写了一段代码,以帮助我理解IO.select如何与套接字对象以及IO对象STDIN和STDOUT一起工作,但我只是想不通。

这是我的代码:

require 'socket'

socket = TCPSocket.open("10.0.0.33", 4444)
while true
    IO.select([socket], nil, nil) #I'm changing the arguments in this line

    puts(1)
    socket.gets.chomp
    puts(2)

    sleep(1)
end

如我所料,如果我运行上述代码,直到从Linux机器发送消息之前,什么都不会发生。当我这样做时,将打印出1和2,然后再没有任何反应,直到我从Linux发送另一条消息为止(如我所料)。

但是,如果我仅将IO.select行更改为

IO.select(nil, [socket], nil)

立即打印出1,我不明白为什么。

如果我向以下任何人发出此行:

IO.select(nil, [STDIN], nil)

IO.select(nil, [STDOUT], nil)

IO.select([STDOUT], nil, nil)

立即打印1。

为什么每次我在IO.select函数的输出数组参数中放入内容时,IO.select都不会等待? 我以为它应该找到一个准备好通过发送一些数据的IO流,但是我在此程序中什么也不发送。

为什么还要将STDOUT放在IO.select函数的输入数组参数中呢?

0 个答案:

没有答案