Einführung in Named Pipes in der Bash-Shell
Auf Linux- und Unix-basierten Betriebssystemen sind Pipes sehr nützlich, da sie eine einfache Möglichkeit darstellen, IPC (Inter-Process Communication) zu erreichen. Wenn wir zwei Prozesse in einer Pipeline verbinden, wird die Ausgabe des ersten als Eingabe der zweiten verwendet. Um eine sogenannte "anonyme" Pipe zu erstellen, müssen wir lediglich den Operator | verwenden. Anonyme oder unbenannte Pipes halten genauso lange wie die Prozesse, mit denen sie verbunden sind. Es gibt jedoch auch eine andere Art von Rohr, die wir verwenden können: ein FIFO oder benanntes Rohr. In diesem Artikel werden wir sehen, wie benannte Rohre funktionieren und worin sie sich von den Standardrohren unterscheiden.
In diesem Tutorial lernen Sie:
- Was ist eine Named Pipe?
- Erstellen einer Named Pipe
- So erkennen Sie eine Named Pipe
- Funktionsweise von benannten Pipes
- So löschen Sie eine Named Pipe
Einführung in Named Pipes in der Bash-Shell
Verwendete Softwareanforderungen und Konventionen
Eine kurze Erinnerung an die Funktionsweise von Rohren
In einem früheren Tutorial haben wir bereits in der Einführung in die Shell-Umleitungen gesehen, wie Pipes funktionieren und wofür sie verwendet werden können, aber lassen Sie uns nur eine kurze Zusammenfassung machen. In unseren Skripten oder in unseren interaktiven Shell-Sitzungen können wir den Pipe-Operator (|) verwenden, um zwei Prozesse miteinander zu verbinden, so dass die Standardausgabe (stdout) des Prozesses auf der linken Seite des Rohrs als Standardeingabe (stdin) des Prozesses auf der rechten Seite des Rohrs verwendet wird. Hier ist eine kurze und triviale Demonstration:
echo "goot" | tr 't' 'd'
good
Im obigen Beispiel wird die Ausgabe des Befehls echo als Standardeingabe des tr-Befehls verwendet. Für diejenigen unter Ihnen, die es nicht wissen, kann der Befehl tr verwendet werden, um Zeichen zu übersetzen oder zu löschen: Hier haben wir ihn verwendet, um alle Vorkommen des Zeichens t durch das Zeichen d zu ersetzen. Das Ergebnis der beiden Befehle, die in einer so genannten Pipeline zusammengeführt werden, ist die Zeichenfolge "good ".
Was wir im obigen Beispiel verwendet haben, wird als unbenannte Pipe bezeichnet. Ein solcher Pipe-Typ existiert nur bis zur Ausführung der Befehle und kann danach nicht mehr aufgerufen werden. Wenn wir eine Pipe erstellen und in der Lage sein wollen, sie nach ihrer Verwendung zu referenzieren
müssen wir die sogenannten benannten Pipes verwenden, sehen wir uns an, was sie sind und wie sie funktionieren.
Was ist eine Named Pipe?
Auf Unix-basierten Betriebssystemen wie Linux ist eine Named Pipe oder FIFO (first-in, first-out) eine "spezielle" Art von Datei, die verwendet wird, um eine Verbindung zwischen Prozessen herzustellen. Im Gegensatz zu einer "Standard"-Pipe wird auf eine Named Pipe als Teil des Dateisystems zugegriffen, genau wie auf jeden anderen Dateityp. Nach der Erstellung wird eine Named Pipe tatsächlich als Standarddatei angezeigt. Es wird jedoch immer leer erscheinen, da es nicht zum "Speichern" von Informationen verwendet wird. Die Daten, die durch die Pipe geleitet werden, werden direkt vom Kernel verwaltet: Die FIFO-Datei wird nur als Referenz verwendet.
Erstellen einer Named Pipe
Um eine Named Pipe zu erstellen, müssen wir in modernen Linux-basierten Betriebssystemen lediglich den Befehl mkfifo verwenden. In seiner grundlegendsten Verwendung müssen wir dem Programm nur den Namen übergeben, den wir für die FIFO-Datei verwenden möchten. Um beispielsweise eine Named Pipe mit dem Namen pipe0 zu erstellen
, würden wir Folgendes ausführen:
mkfifo pipe0
Falls gewünscht, kann eine Named Pipe auch mit einem bestimmten Satz von Berechtigungen erstellt werden, indem die Option -m (kurz für --mode) des mkfifo-Befehls verwendet wird. Die Option akzeptiert die Dateiberechtigungsbits als Argument, so dass wir beispielsweise zum Erstellen einer named
-Pipe mit 644 Berechtigungen Folgendes ausführen würden:
mkfifo -m 644 pipe0
Werfen wir einen Blick auf die Datei, die als Ergebnis des Ausführens des obigen Befehls erstellt wurde:
ls -l pipe0
prw-r--r--. 1 egdoc egdoc 0 Dec 15 11:55 pipe0
Hier haben wir den Befehl ls mit der Option -l ausgeführt, so dass das Format der langen Auflistung verwendet wurde. In der Ausgabe des Befehls können wir sehen, dass der erste Buchstabe, der vor den Berechtigungsbits erscheint, ein p ist: Dies bedeutet, dass
die Datei tatsächlich eine Named Pipe ist.
Verwenden einer Named Pipe
Wir wissen, wie "Standard"-Rohre funktionieren: Der Standardausgang des Prozesses links vom Rohr | wird als Standardeingang des Prozesses rechts davon verwendet. Named Pipes funktionieren ähnlich. Lassen Sie es uns demonstrieren. Das erste, was wir tun wollen
tun, ist, etwas in die Named Pipe zu schreiben. Um dies zu tun, können wir eine einfache Umleitung verwenden; Wir öffnen einen neuen Terminalemulator und führen den folgenden Befehl aus:
echo "input message" > pipe0
Sobald wir die Eingabetaste drücken, passiert etwas scheinbar Unerwartetes: Der Befehl scheint zu hängen. Dies liegt an der Funktionsweise von Named Pipes: Damit Daten durch eine Named Pipe geleitet werden können, muss die FIFO-Datei an beiden Enden geöffnet werden, und zwar von einem Prozess, der in sie schreibt, und von mindestens jemandem, der daraus lesen möchte.
Da es in diesem Fall nichts gibt, was aus der Pipe "liest" und ihren Inhalt "konsumiert", sagen wir, dass die Pipe blockiert ist. Um dies zu demonstrieren, öffnen wir einen weiteren Terminal-Emulator und verwenden den cat-Befehl, um aus der Named Pipe zu "lesen":
cat pipe0
input message
Wie Sie sehen können, wurde die Nachricht, die wir an die Named Pipe geschrieben haben, auf dem Bildschirm gedruckt und auf dem Terminal, mit dem wir in die Pipe geschrieben haben, ist alles wieder normal (der Befehl hängt nicht mehr und die Eingabeaufforderung der Shell erscheint wieder). Wie Sie im folgenden Clip sehen können, passiert dasselbe, wenn wir das Rohr zum ersten Mal zum Lesen öffnen und nichts darauf schreibt:
Auch hier wird nichts in die pipe0-Datei geschrieben, und sobald der Inhalt einer benannten Pipe "verbraucht" ist, wird die Pipe gelöscht. Einer der Vorteile von Named Pipes gegenüber Standardpipes besteht darin, dass der Schreib- und der Readerprozess nicht gleichzeitig gestartet werden müssen.
Löschen einer Named Pipe
Da es sich bei einer Named Pipe nur um eine Datei handelt, können wir den Befehl rm verwenden, um eine Datei zu entfernen, vorausgesetzt, wir haben die richtigen Berechtigungen zum Ausführen der Aktion. Um die Pipe zu entfernen, die wir in den vorherigen Beispielen erstellt haben, würden wir daher Folgendes ausführen:
rm pipe0
Schlüsse
In diesem Artikel haben wir gelernt, wie Named Pipes unter Linux funktionieren. Wir haben gesehen, wie auf sie als Teil des Dateisystems zugegriffen wird, da sie wie jede andere Datei zu sein scheinen. Wir haben gesehen, wie man Named Pipes mit dem Befehl mkfifo erstellt, what
sind ihre Besonderheit und ein Beispiel für ihre Verwendung. Schließlich haben wir gesehen, wie man eine Named Pipe löscht.
