[#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:44624] Re: CGIからCのプログラムを実行する <再送

From: Nobuyoshi Nakada <nobu@...>
Date: 2008-02-13 15:28:50 UTC
List: ruby-list #44624
なかだです。

At Wed, 13 Feb 2008 22:42:59 +0900,
jtjrb049@yahoo.co.jp wrote in [ruby-list:44623]:
> rubyのCGIからCのプログラムを実行して結果を取得するため、以下のように
> popenを使って、別プログラムへの入出力を取得しています。しかし、 2度目以
> 降のアクセスがくると下記のようなエラーが発生してしまいます。(参照:[表
> 示されるエラー])
> アクセスのたびに別プログラムを起動するようにすれば、このエラーは発生しな
> いと思うのですが、別のプログラムが非常に大きなデータをロードするため、ア
> クセスがあるたびにロードすることは避けたいのです。
> 1度だけのpopenで取得できた入出力のオブジェクトを、2度目以降のアクセスの
> たびに再オープンして使いまわすことはできないのでしょうか?

一度閉じたパイプを開き直す方法はありません。

この別プログラムというのは改造できるのでしょうか。もしできるのな
ら、一行読むごとに処理して、出力にはデータの終わりがわかるように
すればできると思います。

たとえば、別プログラムを一回の出力の終わりを示すマークとして
Ctrl-Dをつけるように改造するなら

  class ParseServlet < HTTPServlet::AbstractServlet
    TERM = "\C-d"
    def do_POST(req, res)
      $io.puts req.query['input']
      if s = $io.gets(TERM)
        s.chomp!(TERM)
        res.body = s
        res['Content-Type'] = "text/plain"
      end
    end
  end

-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦

In This Thread