From: jtjrb049@... Date: 2008-02-13T22:37:19+09:00 Subject: [ruby-list:44622] CGIからCのプログラムを実行する はじめまして、Hiraiと申します。 rubyのCGIからCのプログラムを実行して結果を取得するため、以下のように popenを使って 、別プログラムへの入出力を取得しています。しかし、2度目以降のアクセスが くると下記 のようなエラーが発生してしまいます。(参照:[表示されるエラー]) アクセスのたびに別プログラムを起動するようにすれば、このエラーは発生しな いと思う のですが、別のプログラムが非常に大きなデータをロードするため、アクセスが あるたび にロードすることは避けたいのです。 1度だけのpopenで取得できた入出力のオブジェクトを、2度目以降のアクセスの たびに再オ ープンして使いまわすことはできないのでしょうか? ==========[表示されるエラー]============ http://192.168.36.188:2000/parse -> /parse [2008-02-13 22:12:53] ERROR IOError: not opened for writing test_web.rb:17:in `write' test_web.rb:17:in `puts' test_web.rb:17:in `do_POST' /usr/lib/ruby/1.8/webrick/httpservlet/abstract.rb:35:in `__send__' /usr/lib/ruby/1.8/webrick/httpservlet/abstract.rb:35:in `service' /usr/lib/ruby/1.8/webrick/httpserver.rb:104:in `service' /usr/lib/ruby/1.8/webrick/httpserver.rb:65:in `run' /usr/lib/ruby/1.8/webrick/server.rb:173:in `start_thread' /usr/lib/ruby/1.8/webrick/server.rb:162:in `start' /usr/lib/ruby/1.8/webrick/server.rb:162:in `start_thread' /usr/lib/ruby/1.8/webrick/server.rb:95:in `start' /usr/lib/ruby/1.8/webrick/server.rb:92:in `each' /usr/lib/ruby/1.8/webrick/server.rb:92:in `start' /usr/lib/ruby/1.8/webrick/server.rb:23:in `start' /usr/lib/ruby/1.8/webrick/server.rb:82:in `start' test_web.rb:31 idc-dev01.rozettaidc.local - - [13/Feb/2008:22:12:53 JST] "POST /parse HTTP/1.1" 500 307 ======[ソースコード]================ #!/usr/bin/ruby require 'webrick' include WEBrick s = HTTPServer.new( :Port => 2000, :DocumentRoot => Dir::pwd ) $io = IO.popen("code/parser ./examples/sec00.tagged models/model1/grammar 10000 1 1 1 1", "w+") class ParseServlet < HTTPServlet::AbstractServlet def do_POST(req, res) i = req.query['input'] $io.puts i $io.close_write s_tmp = "" while s = $io.gets s_tmp = "#{s_tmp}\n#{s}" end res.body = "#{s_tmp}" res['Content-Type'] = "text/plain" end end s.mount("/parse", ParseServlet) trap("INT") { s.shutdown } s.start