From: rubikitch@... Date: 2008-02-14T00:30:39+09:00 Subject: [ruby-list:44625] Re: CGIからCのプログラムを実行する <再送 From: jtjrb049@yahoo.co.jp Subject: [ruby-list:44623] CGIからCのプログラムを実行する <再送 Date: Wed, 13 Feb 2008 22:42:59 +0900 るびきちです。 > rubyのCGIからCのプログラムを実行して結果を取得するため、以下のように > popenを使って、別プログラムへの入出力を取得しています。しかし、 2度目以 > 降のアクセスがくると下記のようなエラーが発生してしまいます。(参照:[表 > 示されるエラー]) close_writeしているため、これ以上$ioに書き込めなくなっているからです。 > 1度だけのpopenで取得できた入出力のオブジェクトを、2度目以降のアクセスの > たびに再オープンして使いまわすことはできないのでしょうか? 可能です。 とりあえず問題を簡略化するためにwebサーバーではなくて通常のRubyスクリプトを書いてみましょう。 これは入力された文字列をupcaseしたものとcapitalizeしたものを出力するフィルターにアクセスする例です。 パイプするコマンドの出力が同期モードでないとこれは動きません。 IO.popenの引数と終了マークをCプログラムに置き換えても動きますか? def get_data(io) str = "" while line = io.gets break str if line == "__EOD__\n" # 終了マーク__EOD__が来たら読み込みをやめる str << line end end io = IO.popen("ruby -e 'STDOUT.sync = true; while line = STDIN.gets do puts line.upcase; puts line.capitalize ; puts %!__EOD__!; end'", "r+") io.puts "foo" get_data(io) # => "FOO\nFoo\n" io.puts "bar" get_data(io) # => "BAR\nBar\n" io.puts "baz" get_data(io) # => "BAZ\nBaz\n" io.close -- rubikitch Blog: http://d.hatena.ne.jp/rubikitch/ Site: http://www.rubyist.net/~rubikitch/