В общем случае приведенный выше пример зависнет, поскольку канал все еще открыт для записи , а вызванная вами команда (интерпретатор ruby) ожидает дальнейшие команды / данные.
Другой ответ отправляет __END__
на ruby - это работает здесь, но этот трюк, конечно, не будет работать с любыми другими программами, которые вы можете вызвать через popen
.
Когда вы используете popen
, вам нужно закрыть трубу с помощью IO#close_write
.
IO.popen("ruby", "r+") do |pipe|
pipe.puts "puts 10**6"
pipe.close_write # make sure to close stdin for the program you call
pipe.gets
end
Смотри также:
Ruby 1.8.7 IO # close_write
Ruby 1.9.2 IO # close_write