From: josh.cheek@... Date: 2014-02-28T23:43:43+00:00 Subject: [ruby-core:61156] [ruby-trunk - Bug #9583] [Open] Open3 cannot talk correctly with Ruby when there is a large DATA segment passed through stdin. Broken pipe (Errno::EPIPE) Issue #9583 has been reported by Josh Cheek. ---------------------------------------- Bug #9583: Open3 cannot talk correctly with Ruby when there is a large DATA segment passed through stdin. Broken pipe (Errno::EPIPE) https://bugs.ruby-lang.org/issues/9583 * Author: Josh Cheek * Status: Open * Priority: Normal * Assignee: * Category: * Target version: * ruby -v: ruby 2.2.0dev (2014-03-01 trunk 45219) [x86_64-darwin12.0] * Backport: 1.9.3: UNKNOWN, 2.0.0: UNKNOWN, 2.1: UNKNOWN ---------------------------------------- $ # Tested against $ ruby -v ruby 2.2.0dev (2014-03-01 trunk 45219) [x86_64-darwin12.0] Example $ ruby -e 'puts "__END__"; puts "."*24_568' > f.rb; ruby -r open3 -e 'Open3.popen3("ruby") { |i, o, e| i.write File.read "f.rb"; i.close; puts o.read; puts e.read }' -e:1:in `write': Broken pipe (Errno::EPIPE) from -e:1:in `block in
' from /Users/josh/.rbenv/versions/2.0.0-p247/lib/ruby/2.0.0/open3.rb:217:in `popen_run' from /Users/josh/.rbenv/versions/2.0.0-p247/lib/ruby/2.0.0/open3.rb:99:in `popen3' from -e:1:in `
' If we reduce the size of the data segment by 1 character, it works: $ ruby -e 'puts "__END__"; puts "."*24_567' > f.rb; ruby -r open3 -e 'Open3.popen3("ruby") { |i, o, e| i.write File.read "f.rb"; i.close; puts o.read; puts e.read }' If we take it out of the data segment, it is fine $ ruby -e 'puts "#" + "."*100_000' > f.rb; ruby -r open3 -e 'Open3.popen3("ruby") { |i, o, e| i.write File.read "f.rb"; i.close; puts o.read; puts e.read }' -- http://bugs.ruby-lang.org/