I am getting unexpected behaviour using popen3, which I want to use to run a command like tool ala cmd < file1 > file2
. The below example hangs, so that stdout done
is never reached. Using other tools than cat
may cause hanging, so that stdin done
is never reached. I suspect, I am suffering from buffering, but how do I fix this?
#!/usr/bin/env ruby
require 'open3'
Open3.popen3("cat") do |stdin, stdout, stderr, wait_thr|
stdin.puts "foobar"
puts "stdin done"
stdout.each_line { |line| puts line }
puts "stdout done"
puts wait_thr.value
end
puts "all done"
stdout.each_line
is waiting for further output from cat
because cat
's output stream is still open. It's still open because cat
is still waiting for input from the user because its input stream hasn't been closed yet (you'll notice that when you open cat
in a terminal and type in foobar
, it will still be running and waiting for input until you press ^d
to close the stream).
So to fix this, simply call stdin.close
before you print the output.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With