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:
あさだ たくや