Subject: How do I use popen() to open a process for reading AND writing?
Date: Thu Mar 18 17:16:55 EST 1993

4.5) あるプロセスに対し、入力・出力を同時にオープンするために popen() を使 うにはどうすればいいのでしょうか。

任意のスレーブプロセスに対してパイプを入力・出力両方に使用する際に問題 になるのは、デッドロックが起こり得る、ということです。両方のプロセスが 同時に相手がまだ生成していないデータに対して入力を待っている、という状 態になった場合にデッドロックになります。デッドロックは、両方のプロセス が "完全にデッドロックしないプロトコル (strict deadlock-free protocol)" に従うことによってのみ避けることが出来ます。しかし、それにはプロセスど うしが協力し合う必要があり、popen() のようなライブラリ関数にはふさわし くありません。

'expect' distribution に C プログラマが直接呼び出せるライブラリ関数があ ります。そのうちの一つに popen を入力・出力両方に使ったのと等価なものが あります。その関数はパイプでなく疑似端末を使っており、デッドロックの問 題が起こりません。この関数は BSD、SysV の両方で使用できます。'expect' に関する詳細は次の回答を参照して下さい。


UNIX FAQ LIST / Copyright(c)1994,Ted Timar / tmatimar@isgtec.com


Maintainer: あさだ たくや