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.
-
Wie „dupliziert ein FIFO einen Ausgabestrom in einer Reihe von Shell-Befehlen“? Wird das nicht von
tee
erledigt anstelle eines FIFO? -
Im Beispiel
mkfifo fifo1
erstellt eine Datei im aktuellen Verzeichnis undfifo1
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“? -
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:
-
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. -
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.) -
Lineare Verbindungen zwischen Prozessen sind Rohrleitungen, die als linearer Graph dargestellt werden können. Im Beispiel können Sie die letzte Zeile als
darstelleninfile → 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).