From: Tomoyuki Chikanaga Date: 2012-01-31T23:34:11+09:00 Subject: [ruby-dev:45161] [ruby-trunk - Bug #5952] コマンドラインモードで CGI.new を 2 回実行すると IOError が発生する Issue #5952 has been updated by Tomoyuki Chikanaga. Category set to core r29781 以降 Kernel#readlines (ARGF.readlines) で EOF を検出すると stdin を close するようになっていたようです。以下のようなサンプルで現象を確認できます。 readlines.rb: p STDIN.closed? # => false p readlines # => [] <- Ctrl-D で EOF を送出 p STDIN.closed? # => true p readlines # => [] <- すぐにかえってくる 1.9.2 では最後の STDIN.closed? は false のままで、2度目の readlines は入力を待ちます。 ARGF.current_file が標準入力だったら close しないようにするととりあえずこの現象は直りました。これでどうでしょう。 diff --git a/io.c b/io.c index a3a45c0..e877f13 100644 --- a/io.c +++ b/io.c @@ -7684,7 +7684,8 @@ argf_readlines(int argc, VALUE *argv, VALUE argf) } else { lines = rb_io_readlines(argc, argv, ARGF.current_file); - argf_close(ARGF.current_file); + if ( ARGF.current_file != rb_stdin ) + argf_close(ARGF.current_file); } ARGF.next_p = 1; rb_ary_concat(ary, lines); ---------------------------------------- Bug #5952: コマンドラインモードで CGI.new を 2 回実行すると IOError が発生する https://bugs.ruby-lang.org/issues/5952 Author: Hiroshi SHIBATA Status: Open Priority: Normal Assignee: Category: core Target version: 1.9.3 ruby -v: ruby 1.9.3p28 (2012-01-28 revision 34386) [x86_64-darwin11.2.0] =begin 1.9.3p28, trunk で以下のスクリプトを実行すると2回目の CGI.new で パラメータを受け取る時に IOError が発生します。 % cat cli.rb require 'cgi' CGI.new CGI.new % ruby cli.rb (offline mode: enter name=value pairs on standard input) /Users/hsbt/.rbenv/versions/2.0.0-dev/lib/ruby/2.0.0/cgi/core.rb:595:in `tty?': closed stream (IOError) from /Users/hsbt/.rbenv/versions/2.0.0-dev/lib/ruby/2.0.0/cgi/core.rb:595:in `read_from_cmdline' from /Users/hsbt/.rbenv/versions/2.0.0-dev/lib/ruby/2.0.0/cgi/core.rb:645:in `initialize_query' from /Users/hsbt/.rbenv/versions/2.0.0-dev/lib/ruby/2.0.0/cgi/core.rb:806:in `initialize' from cli.rb:4:in `new' from cli.rb:4:in `
' 1.9.2p290 や 1.8.7p357 ではエラーなく2回パラメータを入力可能です。 =end -- http://bugs.ruby-lang.org/