用管道更改STDIN,它是一个目录

时间:2011-11-21 04:42:24

标签: ruby ruby-1.9

我有这个

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_ingets不起作用?

1 个答案:

答案 0 :(得分:2)

它对我有用,但有以下变化:

     pipe_in.close
 end

+pipe_in.close
+pipe_out.close
+
 Process.wait
 Process.wait

如果没有此更改,您仍然会在原始进程中打开管道,因此读者永远不会看到文件结尾。也就是说,执行等待的进程仍然会打开写入管道导致死锁。