[ruby-core:75532] [Ruby trunk Bug#9082] popen3 hangs when stderr gets lots of output

From: jeremy@...
Date: 2016-05-17 00:20:00 UTC
List: ruby-core #75532
Issue #9082 has been updated by Jeremy Kemper.


Note you can use `Open3.capture3` to safely read stdout and stderr without doing `popen3` + `IO.select` yourself.

Internally, this uses separate threads to read stderr & stdout and to wait for the child process to finish: https://github.com/ruby/ruby/blob/1ec544695fa02d714180ef9c34e755027b6a2103/lib/open3.rb#L257-L273

----------------------------------------
Bug #9082: popen3 hangs when stderr gets lots of output
https://bugs.ruby-lang.org/issues/9082#change-58649

* Author: Rodrigo Rosenfeld Rosas
* Status: Rejected
* Priority: Normal
* Assignee: 
* ruby -v: ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-linux]
* Backport: 
----------------------------------------
Create this program test.rb:

STDERR.puts "some error line\n" * 10_000

Then, try this:

ruby -r open3 -e "Open3.popen3('ruby test.rb'){|i,o,e,t|i.close;o.read}"

For this particular case, if I do "e.read" before "o.read" it works. But for my real case involving the "tidy" command with lots of warnings in the stderr it will freeze even if I call "e.read". Since I don't really need this output, I'm using popen2 and redirecting stderr to /dev/null, so this is not urgent, but I thought you'd like to know about this.

Also, if you replace 10_000 with 1_000 above it also works here.



-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:[email protected]?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>

In This Thread

Prev Next