exec 3を使用して名前付きパイプを開いたままにします。

exec 3を使用して名前付きパイプを開いたままにします。

プロセス次から読む名前付きパイプは通常、プロセスが終了すると終了します。に書くパイプは書き込みを完了します(EOF転送)。場合によっては、パイプに断続的にデータを書き込む複数のプロセスがあり、単一のプロセスがパイプからデータを継続的に読み取ることを望む場合があります。これを行うには、パイプを開くが書き込まない「ダミー」ビルダーを設定できます。

$ mkfifo myPipe
$ cat > myPipe &

仮想ライターは、名前付きパイプを開いたままにします。つまり、データが入力されていないか、永久に閉じられています。したがって、リーダープロセスは、終了して再生成することなく、すべての(他の)正当な作成者から入力を受け取ることができます。

私は見た何人かの人々exec 3>代わりに、cat名前付きパイプを開いたままにしてください。

$ mkfifo myPipe
$ cat < myPipe &
[1] 10796
$ exec 3> myPipe
$ echo "blah" > myPipe
blah

このアプローチはうまく機能しているようで、バックグラウンドでのバーチャルライターについて心配(または整理)する必要がなく、気に入っています。問題は私がそうではないということです。本物それを得なさい。

exec 3>実行する実際のファイルや表示される(バックグラウンド)プロセスなしで名前付きパイプを開いたままにする操作をどのように実行できますか?このアプローチには欠点がありますか?

exec 3(最終的には、書き込みのために名前付きパイプの入力ファイル記述子を開く必要があることを知っているので、この部分が何をするかに特に興味があります。exec 3>

答え1

あなたはそれを誤って分析しました。それはsumexecでは3>fifoありません。コマンドがないと、すべてのリダイレクトがデフォルトのシェルに適用され、リダイレクトは暗黙的に(stdout)ファイル記述子引数(のように)を使用できます。exec 3>fifoexec>3>1

欠点は、開かれたファイル記述子が明示的に閉じられない限り、子プロセス/サブシェルに渡されることですexec 3>&-それらのそれぞれに、パイプのもう一方の端にあるリーダーは、すべての子プロセスが終了するまでEOFを取得できません。

パイプを開いたままにしてパイプを開く間にブロックしないもう1つの方法は、パイプを読み取り/書き込みモードで開くことです。

mkfifo /tmp/fifo
(exec 1<>/tmp/fifo; echo tee; sed 's/e/o/g; 1q' <&1 >&2)
too

関連情報