2011-11-21 26 views
1

我有這個與管道更改STDIN,這是一個目錄

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

+0

該代碼的作品除了幾件事被遺忘。它看起來是耙子的問題,http://stackoverflow.com/q/8212799/398640 – NebulaFox

回答

2

它的工作對我來說,有以下變化:

 pipe_in.close 
end 

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

沒有這個變化,你仍然有原來的進程中打開的管道,所以讀者永遠看不到文件的末尾。也就是說,正在等待的進程仍然會打開寫入管道,導致死鎖。

+0

有趣。出於某種原因,它在'rake'中不起作用,但它在'irb'中起作用。我會就此提出一個新問題。 – NebulaFox