Da APUE
I FIFO possono essere utilizzati per duplicare un flusso di output in una serie di comandi della shell
. Ciò impedisce la scrittura dei dati su un disco
file del disco intermedio (simile all'utilizzo di pipe per evitare file di dischi intermedi).
Ma mentre i tubi possono essere utilizzati solo per connessioni lineari
tra processi, una FIFO ha un nome, quindi può essere utilizzata per
connessioni non lineari .
Si consideri una procedura che deve elaborare due volte un flusso di input filtrato
.
mkfifo fifo1
prog3 < fifo1 &
prog1 < infile | tee fifo1 | prog2
Creiamo il FIFO e poi avviamo prog3 in background, leggendo
dal FIFO. Quindi avviamo prog1 e utilizziamo tee per inviare il suo input
sia alla FIFO che a prog2.
-
In che modo un FIFO "duplica un flusso di output in una serie di comandi della shell"? Non viene fatto da
tee
invece di una FIFO? -
Nell'esempio,
mkfifo fifo1
crea un file nella directory corrente efifo1
sembra sostituibile con un file normale. Allora, qual è lo scopo di un FIFO "impedire la scrittura dei dati su un file del disco intermedio"? -
Cosa significano "connessioni lineari" e "connessioni non lineari" tra processi? Cosa significa che un FIFO può essere utilizzato per collegamenti non lineari, mentre un tubo può essere utilizzato solo per collegamenti lineari tra processi?
Grazie.
Risposta accettata:
-
APUE dice "FIFO possono essere utilizzati per duplicare un flusso di output", non dice che i FIFO duplicano effettivamente il flusso di output. Come fai notare, la duplicazione viene effettuata da
tee
nell'esempio. -
mkfifo
crea un FIFO, che è visibile come “file” nella directory che lo contiene; ma scrivere su FIFO non è come scrivere su un file perché i dati non colpiscono mai il disco. Le pipe, denominate o meno, non forniscono archiviazione per i dati, forniscono canali di comunicazione; l'estremità di scrittura di una pipe non può scrivere dati se non c'è un ricevitore, la pipe trasmette semplicemente i dati, senza memorizzarli. (Sulla maggior parte dei sistemi i tubi sono supportato da piccoli buffer del kernel, per migliorare le prestazioni, ma questo è un dettaglio di implementazione.) -
Le connessioni lineari tra processi sono tubi che possono essere rappresentati come un grafico lineare. Nell'esempio, puoi rappresentare l'ultima riga come
infile → prog1 → tee fifo1 → prog3
che è lineare, ma se si cerca di rappresentare l'intera catena, riducendo ad elementi di lavorazione, è necessario
infile → prog1 → prog2 → prog3
che non è lineare (c'è un nodo nel grafico,
prog1
, che ha due nodi di uscita).