Ответы:
Каналы просто связаны с дескрипторами файлов, отличными от 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, и в этом случае никакие дополнительные файловые дескрипторы не будут открываться при входе в основной процесс.
bashстранице руководства .