Respostas:
Os pipes são simplesmente vinculados a descritores de arquivos diferentes de 0 (stdin):
$ echo <(true)
/dev/fd/63
$ echo <(true) <(true)
/dev/fd/63 /dev/fd/62
É claro que um processo pode ter mais de um descritor de arquivo aberto por vez, portanto não há problema.
pipe()chamada do sistema.
pipe()e bifurca os subprocessos. O processo principal não têm descritores de arquivos adicionais aberto se um pipe anônimo é usado. Esses descritores de arquivos adicionais são passados no formulário /dev/fd/...e o processo geralmente os abre usando esses nomes de arquivos. Isso fará com que sejam dup()editados, criando ainda mais descritores de arquivos abertos. O processo também pode usar o descritor de arquivo chamado imediatamente, sem quaisquer chamadas abertas ...
a, chamei-o como ./a <(ls), e ele imprimiu com êxito a lista de arquivos, provando que o descritor de arquivo nomeado (63 no meu caso) já estava aberto. O bash pode usar pipes nomeados em um diretório temporário em arquiteturas diferentes do Linux; nesse caso, nenhum descritor de arquivo adicional seria aberto ao entrar no processo principal.
bashpágina de manual.