In Linux ist ein Rohr ein Mechanismus für die Inter-Process-Kommunikation (IPC). Es ermöglicht die Ausgabe eines Prozesses direkt mit der Eingabe eines anderen Prozesses und erstellt einen unidirektionalen Datenstrom. Stellen Sie sich dies als einen virtuellen Kanal vor, der Daten zwischen Programmen transportiert, ohne dass Zwischendateien oder komplexe gemeinsame Speichertechniken erforderlich sind.
Hier ist eine Aufschlüsselung:
* Mechanismus: Eine Pfeife ist im Wesentlichen ein Dateideskriptor, der als Puffer fungiert. Der Schreibprozess schreibt Daten in diesen Puffer, und der Leseprozess liest Daten daraus. Der Kernel verwaltet die Pufferung und die Synchronisation zwischen den Prozessen.
* unidirektional: Die Daten fließen nur in eine Richtung - vom Schreibprozess (Produzent) zum Leseprozess (Verbraucher).
* Syntax: Rohre werden mit dem Rohrsymbol `|` in der Schale (z. B. Bash, ZSH) erstellt. Dieses Symbol trennt die Befehle und verbindet die Standardausgabe (STDOut) des Befehls links mit der Standardeingabe (STDIN) des Befehls rechts.
* Beispiel:
Der Befehl `ls -l | Grep "txt" `zeigt ein Rohr.
* `ls -l` listet Dateien und Verzeichnisse in langem Format auf. Die Ausgabe (eine Liste von Dateinamen und Details) wird an das Rohr gesendet.
* `grep" txt "` sucht nach Zeilen, die "txt" enthalten. Es erhält seine Eingabe aus dem Rohr (die Ausgabe von `ls -l`). Die Ausgabe von "grep" txt "" zeigt nur die Dateien mit der Erweiterung ".txt" an.
* Typen: Es gibt zwei Haupttypen:
* anonyme Rohre (unbenannte Rohre): Erstellt mit dem "|" -Operator in der Shell. Sie existieren nur für die Dauer der Kommandopipeline.
* Namen Pipes (FIFOS): Erstellt mit dem Befehl `mkfifo`. Diese Rohre bestehen auch nach dem Erstellungsverfahren, sodass mehrere Prozesse asynchron kommunizieren können. Sie haben einen Namen im Dateisystem.
* Vorteile:
* Effizienz: Die Daten werden direkt zwischen den Prozessen übertragen, wodurch der Aufwand des Erstellens und Lesens temporärer Dateien vermieden wird.
* Einfachheit: Einfach zu bedienen innerhalb von Shell -Befehlen.
* Flexibilität: Ermöglicht das Zusammenketten mehrerer Befehle für komplexe Datenverarbeitungsworkflows.
* Einschränkungen:
* unidirektional: Daten fließen nur in eine Richtung. Für die bidirektionale Kommunikation sind andere IPC -Mechanismen erforderlich (z. B. Sockets).
* Blockierung: Wenn der Schreibprozess schneller Daten erzeugt als der Leseprozess, kann der Schreibprozess blockieren (warten), bis der Puffer über genügend Platz verfügt. In ähnlicher Weise kann der Lesevorgang blockieren, wenn der Puffer leer ist.
Zusammenfassend sind Rohre ein grundlegendes und leistungsstarkes Tool in Linux zum Erstellen effizienter und prägnanter Datenverarbeitungspipelines, indem die Ausgabe eines Programms nahtlos mit der Eingabe eines anderen verbunden ist.