Risposte:
Le pipe sono semplicemente associate a descrittori di file diversi da 0 (stdin):
$ echo <(true)
/dev/fd/63
$ echo <(true) <(true)
/dev/fd/63 /dev/fd/62
Un processo può ovviamente avere più di un descrittore di file aperto alla volta, quindi non ci sono problemi.
pipe()chiamata di sistema.
pipe()e quindi esegue il fork dei sottoprocessi. Il processo principale fa hanno descrittori di file addizionali aperta se viene utilizzato un tubo anonimo. Questi descrittori di file aggiuntivi vengono passati nel modulo /dev/fd/...e il processo di solito li apre semplicemente usando questi nomi di file. Ciò li porterà alla loro modifica dup(), creando descrittori di file ancora più aperti. Il processo potrebbe anche usare subito il descrittore di file con nome senza chiamate aperte ...
a, l'ho chiamato come ./a <(ls), e ha stampato correttamente l'elenco dei file, dimostrando che il decriptatore di file (63 nel mio caso) era già aperto. Il bash potrebbe usare named pipe in una directory temporanea su architetture diverse rispetto a Linux, nel qual caso nessun descrittore di file aggiuntivo sarebbe aperto quando si accede al processo principale.
bashpagina man.