回答:
パイプは単に0(stdin)とは異なるファイル記述子にバインドされています。
$ echo <(true)
/dev/fd/63
$ echo <(true) <(true)
/dev/fd/63 /dev/fd/62
もちろん、プロセスは一度に複数のオープンファイル記述子を持つことができるため、問題はありません。
pipe()システムコールによって作成された、単なるパイプです。
pipe()、サブプロセスを使用して匿名パイプを作成し、サブプロセスをフォークします。匿名パイプが使用されている場合、メインプロセスは追加のファイル記述子を開いています。これらの追加のファイル記述子はの形式/dev/fd/...で渡され、プロセスは通常、これらのファイル名を使用して単にそれらを開きます。これにより、それらがdup()編集され、さらに多くのオープンファイル記述子が作成されます。このプロセスでは、名前の付いたファイル記述子を、開いている呼び出しなしですぐに使用することもできます...
a、私はそれをとして呼び出し./a <(ls)、ファイルのリストを正常に印刷し、指定されたファイル記述子(私の場合は63)がすでに開いていることを証明しました。bashはLinuxとは異なるアーキテクチャの一時ディレクトリで名前付きパイプを使用する場合があります。その場合、メインプロセスに入るときに追加のファイル記述子が開かれません。
bashmanページを。