[#44725] Set[Set[1]]==Set[Set[1]] は偽? — "5.5" <5.5@...>

5.5 です。

22 messages 2008/03/04

[#44782] $stdin.rewind が exec した子プロセスに伝わらない? — SATOH Fumiyasu <fumiyas@...>

さとうふみやす @ OSS テクノロジです。

11 messages 2008/03/17
[#44783] Re: $stdin.rewind が exec した子プロセスに伝わらない? — Kazuhiro NISHIYAMA <zn@...> 2008/03/17

西山和広です。

[ruby-list:44716] Re: パイプ経由コマンド実行?

From: "m-morita" <m-morita@...>
Date: 2008-03-03 06:05:58 UTC
List: ruby-list #44716
もりた です。

実際のプログラムから、例示を取り出す際に間違えて、ご迷惑をおかけしました。
本庄さんのおっしゃる通り write が抜けており、write を入れればインタプリタ
終了時に書き出されます。(すみません)

で問題は、永井さんのおっしゃるようにバッファリングの問題でした。
ただ言語使用として合点がいきません。
より実情に即して例示します。
 require "open-uri"
 open("|ruby t.rb","w").write open("http://www.google.co.jp").read # -- (1)
 # ... many executions as above
 open("|ruby t.rb","w").write("AAAA")

ここで (1) の終了時点で t.rb にデータがわたってきません(デバッガーで
ステップ実行すればわかります)。
しかし、この一行で読み書きは完了しています。
読み書き途中のまま次のスクリプト行に移っていませんし、この行の次へ行っ
てしまうと、実装側もこのI/O が見えなくなっているはずです。(結局、インタ
ープリタ終了時に吐き出されるようですが,,,)
 これは、この行の終了時にバッファフラッシュして IO を終えるべきではない
でしょうか?
(ただ不思議なことは、cat 等の built-in ならば即時実行されます。)

永井さん、
> 典型的な I/O のバッファリングに関連する問題かと思います.
> 書き出し側がバッファにため込んだ状態のまま,
> 送り出すことなく終了してしまっているためでしょう.
現象はその通りなのですが、プログラムは後始末を怠っているわけではなく、
一行で完結しているように思えます。

> 「IO#flush の実行」, 「IO#sync=true に設定」, 「IO#syswrite を利用」
> のいずれかで問題を解消できるのではないでしょうか.
たぶんディスクリプタ等を変数定義して複数行でやると、何とかなるかもしれませ
ん。

ruby の魅力は簡潔なところなので、一行ですむ記述は一行で書きたい気がします。

>「Ruby アプリケーションプログラミング」の
>「5.2.3 外部コマンドとの通信」が
> 丁度この問題をテーマとして扱っておりますので,
> 書店などで見掛けましたら参考にしていただけますと幸いです.
アドバイスありがとうございます。今後の参考させていただきます。


In This Thread