GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Der Zweck der Verwendung eines Fifo im Vergleich zu einer temporären Datei oder einer Pipe?

Von APUE

FIFOs können verwendet werden, um einen Ausgabestrom in einer Reihe von Shell-Befehlen
zu duplizieren
. Dies verhindert das Schreiben der Daten in eine Zwischendatei
auf der Festplatte
(ähnlich der Verwendung von Pipes zur Vermeidung von Zwischenspeicherdateien).

Aber während Pipes nur für lineare Verbindungen
zwischen Prozessen verwendet werden können, hat ein FIFO einen Namen, sodass er für
nichtlineare Verbindungen verwendet werden kann .

Stellen Sie sich eine Prozedur vor, die einen gefilterten Eingabestrom
zweimal verarbeiten muss.

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

Wir erstellen das FIFO und starten dann prog3 im Hintergrund und lesen
aus dem FIFO. Dann starten wir prog1 und verwenden tee, um seine Eingabe
sowohl an den FIFO als auch an prog2 zu senden.

  1. Wie „dupliziert ein FIFO einen Ausgabestrom in einer Reihe von Shell-Befehlen“? Wird das nicht von tee erledigt anstelle eines FIFO?

  2. Im Beispiel mkfifo fifo1 erstellt eine Datei im aktuellen Verzeichnis und fifo1 scheint durch eine normale Datei ersetzbar zu sein. Was also ist der Sinn eines FIFOs „das Schreiben der Daten in eine Zwischendatei auf der Festplatte verhindern“?

  3. Was bedeuten „lineare Verbindungen“ und „nichtlineare Verbindungen“ zwischen Prozessen? Was bedeutet es, dass ein FIFO für nichtlineare Verbindungen verwendet werden kann, während eine Pipe nur für lineare Verbindungen zwischen Prozessen verwendet werden kann?

Danke.

Akzeptierte Antwort:

  1. APUE sagt:„FIFOs können verwendet werden um einen Ausgabestrom zu duplizieren“, heißt es nicht, dass FIFOs tatsächlich den Ausgabestrom duplizieren. Wie Sie darauf hinweisen, erfolgt die Duplizierung durch tee im Beispiel.

  2. mkfifo erstellt einen FIFO, der als „Datei“ im enthaltenden Verzeichnis sichtbar ist; aber das Schreiben in den FIFO ist nicht wie das Schreiben in eine Datei, da die Daten niemals auf die Festplatte gelangen. Pipes, ob benannt oder nicht, bieten keine Speicherung von Daten, sie stellen Kommunikationskanäle bereit; Das schreibende Ende einer Pipe kann keine Daten schreiben, wenn es keinen Empfänger gibt, die Pipe leitet nur Daten weiter, ohne sie zu speichern. (Auf den meisten Systemen sind Pipes unterstützt durch kleine Kernelpuffer, um die Leistung zu verbessern, aber das ist ein Implementierungsdetail.)

  3. Lineare Verbindungen zwischen Prozessen sind Rohrleitungen, die als linearer Graph dargestellt werden können. Im Beispiel können Sie die letzte Zeile als

    darstellen
    infile → prog1 → tee fifo1 → prog3
    

    Das ist linear, aber wenn Sie versuchen, die gesamte Kette darzustellen und auf Verarbeitungselemente zu reduzieren, benötigen Sie

    infile → prog1 → prog2
                   → prog3
    

    was nichtlinear ist (es gibt einen Knoten im Diagramm, prog1 , die zwei Exit-Knoten hat).

Verwandte:Wie erstelle ich ein neues Fenster im aktuellen Verzeichnis in tmux?
Linux
  1. So extrahieren Sie die tar.gz-Datei in Linux mithilfe der Befehlszeile

  2. Verwenden von Google Drive über die Linux-Befehlszeile

  3. Was ist der Zweck der .bashrc-Datei in Linux

  4. Wie schreibe ich stderr in eine Datei, während ich tee mit einer Pipe verwende?

  5. Herunterladen einer Datei mit wget über mehrere Verbindungen

Verwenden der SSH-Konfigurationsdatei

So überwachen Sie den Fortschritt von Daten durch eine Pipe mit dem Befehl „pv“.

Muss Pipe eine temporäre Datei schreiben?

Entfernen Sie eine Datei unter Linux mithilfe der Inode-Nummer

Kopieren einer Datei nur, wenn sie neuer als das Ziel ist

Versehentlich die Ausgabeumleitung > anstelle eines senkrechten Strichs | verwendet