Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby $stdout.get应该在何时返回输出,为什么?_Ruby_Multithreading_Pipe - Fatal编程技术网

Ruby $stdout.get应该在何时返回输出,为什么?

Ruby $stdout.get应该在何时返回输出,为什么?,ruby,multithreading,pipe,Ruby,Multithreading,Pipe,我有这样的服务器模式: sleep 5 puts 'Server started' loop { } 当我在irb中运行它时: arr=Open3.popen3('ruby server.rb') arr[1]。获取 gets块,即使我知道它应该返回'Server started',但它没有返回。 当我中断它并调用arr[1]。再次获取时,它会立即返回“服务器已启动” 如何使它在第一次arr[1]时返回输出。获取 另外,当我从服务器中删除循环{}时,它工作得非常好。您必须选择输出缓冲区: pu

我有这样的服务器模式:

sleep 5
puts 'Server started'
loop { }
当我在irb中运行它时:

arr=Open3.popen3('ruby server.rb') arr[1]。获取

gets块,即使我知道它应该返回'Server started',但它没有返回。 当我中断它并调用
arr[1]。再次获取
时,它会立即返回“服务器已启动”

如何使它在第一次
arr[1]时返回输出。获取

另外,当我从服务器中删除
循环{}
时,它工作得非常好。

您必须选择输出缓冲区:

puts 'Server started'
$stdout.flush
或启用模式:

您必须输入输出缓冲区:

puts 'Server started'
$stdout.flush
或启用模式:


loop{}
创建无限循环..@OMG因为它在单独的线程中,所以它不应该影响(put已经写入stdout…
loop{}
创建无限循环..@OMG因为它在单独的线程中,所以它不应该影响(put已经写入stdout…)谢谢,@Stefan!为了更好地理解OS(和Ruby)IO,我还想读一些书,你有吗?为什么第二个
get
可以工作?
是否获取内部刷新?为什么不自动刷新?
sync
仅在IO与终端设备关联时启用。它不限于终端设备。适用于IO设备,包括文件。终端是IO设备的一种类型:
$stdout.class=>IO
并且在未重定向时,
$stdout.tty?=>是的
。谢谢,@Stefan!为了更好地理解OS(和Ruby)IO,我还想读一些书,你有吗?为什么第二个
get
可以工作?
是否获取内部刷新?为什么不自动刷新?
sync
仅在IO与终端设备关联时启用。它不限于终端设备。适用于IO设备,包括文件。终端是IO设备的一种类型:
$stdout.class=>IO
并且在未重定向时,
$stdout.tty?=>正确