Re: [Q] パイプで通信
新城@筑波大学情報です。こんにちは。
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() 。
\\ 新城 靖 (しんじょう やすし) \\
\\ 筑波大学 電子・情報 \\
Fnews-brouse 1.9(20180406) -- by Mizuno, MWE <mwe@ccsf.jp>
GnuPG Key ID = ECC8A735
GnuPG Key fingerprint = 9BE6 B9E9 55A5 A499 CD51 946E 9BDC 7870 ECC8 A735