我有这个
pipe_in, pipe_out = IO.pipe
fork do
# child 1
pipe_in.close
STDOUT.reopen pipe_out
STDERR.reopen pipe_out
puts "Hello World"
pipe_out.close
end
fork do
# child 2
pipe_out.close
STDIN.reopen pipe_in
while line = gets
puts 'child2:' + line
end
pipe_in.close
end
Process.wait
Process.wait
get
将始终引发错误,说“获取:是一个目录”,这对我来说没有意义。如果我将gets
更改为pipe_in.gets
则可行。我想知道的是,为什么STDIN.reopen pipe_in
和gets
不起作用?
答案 0 :(得分:2)
它对我有用,但有以下变化:
pipe_in.close
end
+pipe_in.close
+pipe_out.close
+
Process.wait
Process.wait
如果没有此更改,您仍然会在原始进程中打开管道,因此读者永远不会看到文件结尾。也就是说,执行等待的进程仍然会打开写入管道导致死锁。