GNU/Linux >> Linux Esercitazione >  >> Linux

Lo scopo dell'utilizzo di un Fifo contro un file temporaneo o una pipe?

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.

  1. 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?

  2. Nell'esempio, mkfifo fifo1 crea un file nella directory corrente e fifo1 sembra sostituibile con un file normale. Allora, qual è lo scopo di un FIFO "impedire la scrittura dei dati su un file del disco intermedio"?

  3. 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:

  1. 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.

  2. 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.)

  3. 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).

Correlati:come creare una nuova finestra nella directory corrente in tmux?
Linux
  1. Crea file utilizzando la riga di comando in Linux

  2. Come scrivo stderr su un file mentre uso tee con una pipe?

  3. posizione del file temporaneo quando si utilizza tmpfile() in C

  4. Come inserisco il testo nella prima riga di un file usando sed?

  5. Pipe deve scrivere un file temporaneo?

Utilizzo del file di configurazione SSH

Come estrarre il file tar.gz in Linux utilizzando la riga di comando

Come monitorare l'avanzamento dei dati attraverso un tubo utilizzando il comando "pv".

Rimuovi un file su Linux usando il numero di inode

Come aprire un file in vim usando pipe

Come modificare la codifica utilizzata dal mio server SFTP?