Implementação de substituição de processo e simultaneidade em substituição de processo

0

O Manual do Bash diz

Process substitution is supported on systems that support named pipes ( fifos) or the /dev/fd method of naming open files.

  1. Significa que a subestituição do processo é implementada em termos de pipes nomeados, ou em termos de um arquivo em /dev/fd ?
  2. Como a substituição de processos é implementada no Linux?

    O seguinte exemplo significa que a substituição do processo no Linux é implementado em termos de um arquivo em /dev/fd , em vez de nomeado tubos?

    $ echo <(cat)
    /dev/fd/63
    
  3. Em command1 <(command2) , os dois comandos estão funcionando no mesmo tempo, ou um começa depois que os outros acabamentos em execução?

    Se a substituição do processo for implementada em termos de pipes nomeados, isso significa que os dois comandos no exemplo de substituição de processo está sendo executado ao mesmo tempo? Meu palpite é porque canos e pipes nomeados são usados para comunicação entre concorrentes executando processos e os comandos em um pipeline estão sendo executados ao mesmo tempo.

    Eu tenho essa pergunta ao tentar entender a parte 2 em uma resposta link .

Obrigado.

    
por Tim 31.05.2016 / 04:20

3 respostas

2

  1. De strace output de strace -v -f -s150 -o log bash -c 'echo <(cat)' , no meu sistema, / dev / fd é implementado como pipe. Cria um pipe com 3, 4 fds e depois dups 3 a 63.
  2. /dev/fd é apenas um link simbólico para /proc/self/fd . Meu sistema não possui% symlink e a saída é apenas /dev/fd . Bash apenas opera com canos. No código fonte do bash, parece que ele pode ser emulado como os outros bash'isms como /proc/self/fd/63 , mas não tenho certeza. Eu não vejo estes em /dev/tcp no entanto.
  3. Se eu substituir busybox ash builtin por echo e do tty por todo o bash, vejo que strace é executado primeiro, então tty é executado com fds de pipe pré-carregado.
por 31.05.2016 / 19:06
1

1., 2 .: Sim, substituição de processo é implementado em termos de pipes nomeados (open source = você pode ler a fonte)

3.

If process substitution is implemented in terms of named pipes, does that mean that the two commands in the example of process substitution are running at the same time?

Sim, significa que eles são executados simultaneamente.

    
por 31.05.2016 / 19:20
1

Para o ponto 3, se definirmos:

$ d(){ printf '%7s %7s %s\n' "$BASHPID" "$1" $(date -u +'%H:%M:%S'); }
$ p1(){ d START; readarray -t a; printf '%s\n' "${a[@]}" ; sleep 2; d END; }
$ p2(){ d START; sleep 2; d END; }

Então, isso:

$ p1 < <(p2)

imprimirá:

   8517   START 20:31:38
  11764   START 20:31:38
  11764     END 20:31:40
   8517     END 20:31:42

Isso significa que ambos começam juntos, mas p1 tem que esperar até que p2 termine para fechar a leitura, então ela dorme e termina.

Resumindo: eles são executados simultaneamente.

    
por 31.05.2016 / 22:39