新城@筑波大学情報です。こんにちは。

In article <m3k79a2qaf.fsf@nightmare.hm.taito.co.jp>
        Takahide Nojima <nojima@taito.co.jp> writes:
>  この時、名前無しpipeを2本作り、片方のpipeを使ってプロセスAから
> プロセスBへデータを出力し、同時にもう片方のpipeを使ってプロセスAが
> 再度受け取るというものを作ろうとしたと仮定します。
> +-->B-->+
> |       |
> +---A---+
>  この場合にプロセスAはどうすれば、
>   ・ プロセスBにできるだけ滞ることなくデータを出力でき、
>   ・ プロセスBからできるだけ滞ることなくデータを得ることが出来
> ますでしょうか?

私なら、A をマルチスレッドで書きます。たとえば、こんな感じ。

    新城: "外部プログラムとキャッシングを利用した堆積可能汎用フィ
    ルタ・ファイル・オブジェクトの実現方式",情報処理学会論文誌,
    Vol.41, No.6, pp.1708-1722 (2000).
    http://www.ipsj.or.jp/members/Journal/Jpn/4106/article008.html

それから、一番簡単なのは、B を毎回毎回 fork しては exec して
使い回すことです。遅いけど。ファイルにデータを全部出力して

        f = popen("B < file","r")

とします。

速くするなら、B に手を入れてTCP/IP 上のプロトコルのような形
で、要求と応答の組になるように書き換えるか、RPC にするかしま
す。RPC にしたのはこれ。

    Y.Shinjo: "The World Wide Shell based on The Object-Stacking
    Model", Proc. The Worldwide Computing and Its Applications '97
    (WWCA97), pp.C-4-2-1--C-4-2-16 (March 10-11, Tsukuba, 1997).
    (also in Springer LNCS 1274, pp.410-425).

kakasi を毎回起動すると遅いから、一度起動してから動かしっぱ
なしにして、web proxy からを RPC でつなぎました。

> #O_NONBLOCKとかはpipeだと何でかわからないのですが効いてくれないし、

O_NONBLOCK よりは、マルチスレッドだなあ。
マルチスレッドより上の逐次の popen() 。

\\ 新城 靖 (しんじょう やすし) \\
\\ 筑波大学 電子・情報       \\