7

パイプの反対側が接続を受信するのを待って open() 呼び出しがハングしないように、特定のパイプに対して開かれたファイル記述子を使用してサブプロセスを呼び出したいと考えています。

デモンストレーションするには:

$ mkfifo /tmp/foobar.pipe
$ some_program --command-fd=5 5</tmp/foobar.pipe

この場合、some_program何らかのプロセスが/tmp/foobar.pipe書き込み用に開かれるまで実行されません。ただし、some_programコマンドを受信して​​いない場合でも有用な効果があるため、目的の動作をsome_programすぐに実行する必要があります。

/tmp/foobar.pipe代替スクリプト言語 (python、perl など) またはフラグで開く C ラッパーを介して実行することでこれを行うメカニズムO_NONBLOCKは明らかです。可能であれば、純粋なbashソリューションを探しています。

4

2 に答える 2

9

パイプラインのセットアップ時に読み取り専用ではなく読み取り/書き込みでFDを開くと、ブロッキングが防止されます。

もう少し具体的に:

$ mkfifo /tmp/foobar.pipe
$ some_program --command-fd=5 5<>/tmp/foobar.pipe

まだ設定されているにもかかわら5<>/tmp/foobar.pipeず、RWモードで開く(読み取り専用モードで開くのとは対照的に)など、望ましくないブロッキング動作を防ぎます。このポインタを提供してくれたirc://irc.freenode.org/#bashのwaldnerに感謝します。5</tmp/foobar.pipeO_NONBLOCK

于 2008-10-07T17:12:31.267 に答える
3

この種の結果を得ることを私が知っている唯一の方法はハックです:

mkfifo /tmp/foobar.in
mkfifo /tmp/foobar.out
( cat </tmp/foobar.in ) >/tmp/foobar.out &
some_program --command-fd=5 5</tmp/foobar.out

おそらくこれが役立ちます:-)

于 2008-10-07T16:39:20.493 に答える