From: "H.Yamamoto" Date: 2004-07-16T21:50:15+09:00 Subject: [ruby-dev:23927] Re: Ruby 1.8.2 preview1にむけて 山本です。 IO.popen のコマンドである webrick/httpservlet/cgi_runner.rb をトレースしてみたところ、 26行目の STDOUT.reopen(open(out, "w")) で固まっていることがわかりました。 そこで、ここをコメントアウトしたところ、test/soap/calc/server.cgi を exec する所まで行きました。 しかし、今度は test/soap/calc/server.cgi の require 'soap/rpc/cgistub' から帰ってきません。 そこで soap/rpc/cgistub.rb の require 部分を p "===========> 0" require 'soap/streamHandler' p "===========> 1" require 'webrick/httpresponse' p "===========> 2" require 'webrick/httpstatus' p "===========> 3" require 'logger' p "===========> 4" require 'soap/rpc/router' p "===========> 5" というようにトレースしてみたのですが、4 まで行ったところでタイムアウトして しまいました。 単に require 'soap/rpc/cgistub' と書いたスクリプトを実行した場合には、 0 から 4 までがすぐに表示され、5 が表示されるのに若干時間がかかるものの、 全体として 7 秒ほどで処理が終わります。 これと比べると、test のときは何倍も遅くなっている感じです。なぜ遅くなるのか はよくわかりませんが、タイムアウトの時間を長くすれば、処理が全部終わる のではないかと思います。(タイムアウトの時間を長くしようと思ったのですが、 場所がわかりませんでした) あと、STDOUT.reopen ですが、irb 上から実行すると再現しました。HEAD でも 同じです。 E:\ruby_1_8\bin>irb irb(main):001:0> STDOUT.reopen(open('e:/hoge', 'w')) (フリーズ。CTRL+C も効かない) E:\ruby_1_8\bin>irb irb(main):001:0> STDERR.reopen(open('e:/hoge', 'w')) => # irb(main):002:0> (成功) でも、スクリプトだと動くのです。 E:\ruby_1_8\bin>type ..\a.rb STDOUT.reopen(open("e:/hoge", "w")) puts "foo/bar" E:\ruby_1_8\bin>ruby ..\a.rb E:\ruby_1_8\bin>type e:\hoge foo/bar よくわかりません。