2008年2月14日

[ruby-list:44625] Re: CGIからCのプログラムを実行する <再送

From: jtjrb049@xxxxx
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/

投稿者 xml-rpc : 2008年2月14日 00:30
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/69711
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。