From: "eweb (Eamonn Webster)" Date: 2013-10-21T21:36:30+09:00 Subject: [ruby-core:57951] [ruby-trunk - Bug #9040][Open] Readline duplicate file descriptors but doesn't close them Issue #9040 has been reported by eweb (Eamonn Webster). ---------------------------------------- Bug #9040: Readline duplicate file descriptors but doesn't close them https://bugs.ruby-lang.org/issues/9040 Author: eweb (Eamonn Webster) Status: Open Priority: Normal Assignee: Category: core Target version: current: 2.1.0 ruby -v: ruby 2.1.0dev (2013-09-22 trunk 43011) [x86_64-darwin12.5.0] Backport: 1.9.3: UNKNOWN, 2.0.0: UNKNOWN This depends on the max open files limit, happens quicker the lower the limit. irb crashes just by holding down return. Uses two file descriptors per prompt. input=': Too many open files - dup (Errno::EMFILE) or if you don't want to hold down the key... ulimit -n 100 ruby -r readline -e "100.times{ Readline.input = STDIN }" A recent patch to readline to avoid a segv when the underlying FILE has been closed, changed the way that the input and output streams are assigned. When a stream is assigned, its file descriptor is extracted, dup'ed and passed to fdopen. As the file descriptor is dup'ed the two file descriptors (in the FILE owned by the readline library and the one inside the ruby rb_io_t) don't match. Before assigning the previous value should be cleared. But this only happens when the ruby stream has been closed or when the two file descriptors are the same (never). As we always dup the file descriptors, we own them, and should always close them. -- http://bugs.ruby-lang.org/