5.6 Named Pipes
Ein recht selten verwendetes Konzept steht Ihnen in der Kommandozeile der Shell mit einer Named Pipe zur Verfügung. Named Pipes sind den normalen Pipes sehr ähnlich, nur haben diese einen entscheidenden Vorteil: Hiermit kann eine schon existierende Pipe von beliebigen Prozessen genutzt werden. Vereinfacht ausgedrückt: Eine Named Pipe ist eine Konstruktion, welche die Ausgabe eines Prozesses als Eingabe zur Verfügung stellt. Bei normalen Pipes mussten die Prozesse vom selben Elternprozess abstammen (um an die Dateideskriptoren heranzukommen).
Zum Anlegen einer Named Pipe wird das Kommando mknod oder mkfifo verwendet:
mknod name p
mkfifo name
Da beim Kommando mknod auch mehrere Arten von Dateien angelegt werden können, muss hier die gewünschte Art durch einen Buchstaben gekennzeichnet werden. Bei einer Named Pipe ist dies ein p. Named Pipes werden häufig auch als FIFOs bezeichnet, weil Sie nach dem First-In-First-Out-Prinzip arbeiten. Jedoch tun dies normale (temporäre) Pipes auch, weshalb hier eine unterscheidende Bezeichnung nicht passen würde.
you@host > mknod apipe p
you@host > ls -l apipe
prw-r--r-- 1 tot users 0 2005–03–07 06:10 apipe
Beim Dateityp taucht die Named Pipe mit einem p auf. In die Named Pipe können Sie etwas einfügen mit:
you@host > echo "Hallo User" > apipe
Ein anderer Prozess könnte die Pipe jetzt wie folgt wieder auslesen:
tot@linux > tail -f apipe
Hallo User
Wie Ihnen hierbei sicherlich auffällt, kann der erste Prozess, der in die Pipe schreibt, erst dann weiterarbeiten, wenn ein zweiter Prozess aus dieser Pipe liest, also ein weiterer Prozess die Leseseite einer Pipe öffnet.
Die Named Pipe existiert natürlich weiter, bis diese wie eine gewöhnliche Datei gelöscht wird. Damit neben anderen Prozessen auch noch andere User auf eine Named Pipe lesend und schreibend zugreifen können, müssen Sie die Zugriffsrechte anpassen, denn standardmäßig verfügt nur der Eigentümer über Schreibrecht (abhängig von umask). Im Unterschied zu einer normalen Pipe, die in einem Schritt erzeugt wird (ein Inode-Eintrag, zwei Datei-Objekte und die Speicherseite) und sofort zum Lesen und Schreiben bereitsteht, werden die Named Pipes von den Prozessen im Userspace geöffnet und geschlossen. Dabei beachtet der Kernel, dass eine Pipe zum Lesen geöffnet ist, bevor etwas hineingeschrieben wird, sowie dass eine Pipe zum Schreiben geöffnet ist, bevor sie auch zum Lesen geöffnet wurde. Auf der Kernelebene ist dies in etwa dasselbe wie beim Erzeugen einer Gerätedatei (Device File).
Zwar ist es auch hier möglich, dass mehrere Prozesse dieselbe Named Pipe benutzen, allerdings können Daten nur in einer 1:1-Beziehungen ausgetauscht werden. Das heißt, Daten, die ein Prozess in die Pipe schreibt, können nur von einem Prozess gelesen werden. Die entsprechenden Zeilen werden hierbei in der Reihenfolge der Ankunft gespeichert, die älteste Zeile wird an den nächsten lesenden Prozess vermittelt (eben das FIFO-Prinzip).
Beachten Sie außerdem, dass sich eine Pipe schließt, wenn einer der Prozesse (auch echo und read) abgeschlossen ist. Dies macht sich besonders dann bemerkbar, wenn Sie vorhaben, aus einem Script mehrere Zeilen in eine Pipe zu schieben bzw. mehrere Zeilen daraus zu lesen. Um dieses Problem zu umgehen, müssen Sie eine Umleitung am Ende einer Schleife verwenden, so zum Beispiel:
# Demonstriert das Lesen mehrerer Zeilen aus einer Named Pipe
# areadpipe
while read zeile
do
echo $zeile
done < apipe
Das Gegenstück:
# Demonstriert das Schreiben mehrerer Zeilen in eine Named Pipe
# awritepipe
while true
do
echo "Ein paar Zeilen für die Named Pipe"
echo "Die zweite Zeile soll auch ankommen"
echo "Und noch eine letzte Zeile"
break
done > apipe
Das Script bei der Ausführung:
you@host > ./awritepipe
--- [Andere Konsole] ---
tot@linux > ./areadpipe
Ein paar Zeilen für die Named Pipe
Die zweite Zeile soll auch ankommen
Und noch eine letzte Zeile
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.
|