- 締切済み
pipeの使い回し
パイプをつかってpythonやirbなどのラッパーをつくりたいのです。入出力、2本のパイプをつくって、fork()してchildはstdout, inをつなげてexec。parentはパイプから受け取った出力を画面に。画面入力をパイプにおくるように作ろうとしています。parent側でwrite(pipe, str, strlen(str))とするも、パイプをcloseしなければchildからのreadができなくて、引き続きパイプを使いたくてもいったんcloseしているのでもうこのパイプが使えなくなります。パイプを使った通信は一度きりできらなければならないのでしょうか?継続してつかい続ける手法をご存知の方っていらっしゃいませんか?
- みんなの回答 (2)
- 専門家の回答
みんなの回答
- chirubou
- ベストアンサー率37% (189/502)
再度 No.1 です。そうですか、私の勘違いでしたね。 でも、プログラムがのぞみ通り動かない、という事は何かが間違っているわけですが、その何かがほんの些細な事でも動かないのがプログラムの厄介なところです。 ということで、結局はソースを見ないと何も言えない、とい状況のような気がします。
- chirubou
- ベストアンサー率37% (189/502)
pipe は有限バッファなので、それ以上の長さを write しようとするとブロック(write が抜けてこない)してしまいます。ですので、read/write 仕様とする時はデッドロックする可能性があります。 ですから、2本のパイプで read/write する時は、普通は pthread にしてそれぞれのスレッドを read 専用、write 専用にする、あるいは fork して別のプロセスで同様の処理をするようにします。script コマンドもこのような処理をしているハズで、script を ps でみるとプロセスが2つあると思います。 余談ですが、popen(3) で read あるいは write のどちらかしかできないのは上記の理由からです。
補足
早速のご回答ありがとうございました。 私の書き方が悪く、質問の意図が伝わらなかったようです、すいません。 やっていることは後者のforkしてread専用、write専用を作っております。そして片方(子)をexeclpしてpythonなりirbなり他のプログラムにしております。 execしたpythonからの標準出力をパイプにdupして、もとのforkする側(親)からreadで読み出し標準出力へ。親からの標準入力をパイプにdupしてpythonの標準入力へ。としたいのです。ここで親はscanfしてあたかもpythonを使ってるようにしたいのですが、パイプにwriteした後にcloseをしないとpython側がreadできない。ということが問題なのです。 pipeの容量は4Kですが、入力は一回につき10~50文字程度なので容量を超える事はないです。 宜しくお願いします。