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.
-
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?
-
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"?
-
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
-
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.
-
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.)
-
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