[#44578] Ruby初心者が作りました — Kabu and Ruby管理人 <kabu_and_ruby@...>

http://www.geocities.jp/kabuandruby/index.html

26 messages 2008/02/06

[#44691] ”Rubyアプリケーションプログラミング”の伝言サーバの使い方 — "Yangkook Kim" <yangkookkim@...>

キムと申します。オーム社から出版されている書籍、"Rubyアプリケーションプログラミング"のP267~275に掲載されている伝言サーバー&クライアントの利用の仕方がわかりません。質問を要約すると次の2点です。1、サーバーが正常に起動されているかどうかわからない。2、書き込みクライアントで入力をサーバーに送信する方法がわからない。

8 messages 2008/02/24

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

From: rubikitch@...
Date: 2008-02-13 15:30:39 UTC
List: ruby-list #44625
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/

In This Thread