Qual é o propósito de usar um FIFO contra um arquivo temporário ou um pipe?

1

De APUE

FIFOs can be used to duplicate an output stream in a series of shell commands. This prevents writing the data to an intermediate disk file (similar to using pipes to avoid intermediate disk files).

But whereas pipes can be used only for linear connections between processes, a FIFO has a name, so it can be used for nonlinear connections.

Consider a procedure that needs to process a filtered input stream twice.

mkfifo fifo1
prog3 < fifo1 &
prog1 < infile | tee fifo1 | prog2

We create the FIFO and then start prog3 in the background, reading from the FIFO. We then start prog1 and use tee to send its input to both the FIFO and prog2.

  1. Como um FIFO "duplica um fluxo de saída em uma série de comandos do shell"? Isso não é feito por tee em vez de um FIFO?

  2. No exemplo, mkfifo fifo1 cria um arquivo no diretório atual e fifo1 parece substituível por um arquivo normal. Então, qual é o ponto de um FIFO "evitar gravar os dados em um arquivo de disco intermediário"?

  3. O que significa "conexões lineares" e "conexões não lineares" entre processos? O que significa que um FIFO pode ser usado para conexões não-lineares, enquanto um pipe pode ser usado apenas para conexões lineares entre processos?

Obrigado.

    
por Tim 25.03.2018 / 23:57

1 resposta

5

  1. APUE diz que "FIFOs podem ser usados para duplicar um fluxo de saída", não diz que os FIFOs realmente duplicam o fluxo de saída. Como você aponta, a duplicação é feita por tee no exemplo.

  2. mkfifo cria um FIFO, que é visível como um “arquivo” no diretório de contenção; mas escrever para o FIFO não é como gravar em um arquivo porque os dados nunca chegam ao disco. Os pipes, nomeados ou não, não fornecem armazenamento para dados, eles fornecem canais de comunicação; o fim de gravação de um canal não pode gravar dados se não houver receptor, o canal apenas passa os dados, sem armazená-los. (Na maioria dos pipes de sistemas são apoiados por pequenos buffers de kernel, para melhorar o desempenho, mas isso é um detalhe de implementação.)

  3. Conexões lineares entre processos são pipes que podem ser representados como um gráfico linear. No exemplo, você pode representar a última linha como

    infile → prog1 → tee fifo1 → prog3
    

    que é linear, mas se você tentar representar toda a cadeia, reduzindo a elementos de processamento, precisará

    infile → prog1 → prog2
                   → prog3
    

    que não é linear (há um nó no gráfico, prog1 , que tem dois nós de saída).

por 26.03.2018 / 00:09