Замените STDIN с помощью трубы, и это каталог - PullRequest
1 голос
/ 21 ноября 2011

У меня есть

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 не работают?

1 Ответ

2 голосов
/ 21 ноября 2011

Это работает для меня, со следующим изменением:

     pipe_in.close
 end

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

Без этого изменения у вас все еще будут открытые каналы в исходном процессе, поэтому читатель никогда не увидит конец файла.То есть процесс, выполняющий ожидание, все еще имел открытый канал записи, ведущий к тупику.

...