Lassen Sie uns zum Beispiel der Pipes zurückkehren, da es erstens sehr interessant und zweitens eine gute Beschreibung des Link-Prinzips ist. Wenn Sie eine Pipe in der Kommandozeile benutzen, wird diese von der shell erstellt und so benutzt, dass der Befehl vor der Pipe in die Pipe schreibt während der Befehl danach aus ihr liest. Alle Pipes, sowohl anonyme (wie die der shell) als auch benannte (siehe unten) agieren wie FIFOs („First In, First Out“). Wir haben bereits Beispiele für den Gebrauch von Pipes in der shell gesehen, aber lassen Sie uns noch einmal genauer hinsehen:
$ ls -d /proc/[0-9] | head -5 /proc/1/ /proc/2/ /proc/3/ /proc/4/ /proc/5/ |
Ein wichtiger Aspekt bleibt in diesem Beispiel verborgen (der Ablauf ist zu schnell): Schreibaktionen in die Pipe blockieren die Pipe. Das bedeutet, dass nach einem Schreibvorgang des Befehls ls in die Pipe diese solange blockiert ist, bis ein Prozess am anderen Ende wieder daraus liest. Um diesen Effekt besser begreifen zu können, sollten sie einmal eine Named Pipe erstellen, die - anders als die Pipes der shell - Namen besitzen. [23] Der Befehl zur Erstellung einer Named Pipe lautet mkfifo:
$ mkfifo eine_pipe $ ls -il total 0 169 prw-rw-r-- 1 franz franz 0 Dec 10 14:12 eine_pipe| # # Sie sehen, dass der Linkzähler auf 1 steht und die Ausgabe zeigt, # dass die Datei eine Pipe ist ('p'). # # Auch hier können Sie ln benutzen: # $ ln eine_pipe die_selbe_pipe $ ls -il total 0 169 prw-rw-r-- 2 franz franz 0 Dec 10 15:37 eine_pipe| 169 prw-rw-r-- 2 franz franz 0 Dec 10 15:37 die_selbe_pipe| $ ls -d /proc/[0-9] >a_pipe # # Der Prozess ist blockiert, da es keinen Lesebefehl am anderen Ende gibt. # Geben Sie Strg-z ein, um den Prozess anzuhalten... # zsh: 3452 suspended ls -d /proc/[0-9] > eine_pipe # # ...Dann stellen Sie ihn in den Hintergrund: # $ bg [1] + continued ls -d /proc/[0-9] > eine_pipe # # jetzt lesen Sie von der Pipe... # $ head -5 <die_selbe_pipe # # ...und der Schreibprozess beendet sich # [1] + 3452 done ls -d /proc/[0-9] > eine_pipe /proc/1/ /proc/2/ /proc/3/ /proc/4/ /proc/5/ # |
Genauso blockieren natürlich auch Lesevorgänge den Prozess. Wenn Sie die obigen Befehle in umgekehrter Reihenfolge eingeben, werden Sie feststellen, dass head blockiert und auf einen Prozess wartet, der ihm etwas zum Lesen gibt:
$ head -5 <eine_pipe # # Programm blockiert, geben Sie Strg-z ein # zsh: 741 suspended head -5 < eine_pipe # # Stellen Sie ihn in den Hintergrund... # $ bg [1] + continued head -5 < eine_pipe # # ...und füttern Sie ihn :) # $ ls -d /proc/[0-9] >die_selbe_pipe $ /proc/1/ /proc/2/ /proc/3/ /proc/4/ /proc/5/ [1] + 741 done head -5 < eine_pipe $ |
Sie werden bei diesem Beispiel auch einen unerwünschten Effekt feststellen: der Befehl ls wird beendet bevor der Befehl head übernommen hat. Als Folge kehren Sie sofort zum Prompt zurück. Der Befehl head agiert aber erst später, sodass Sie zur Ansicht der Ausgabe noch einmal Return drücken müssen.
[23] Es gibt weitere Unterschiede zwischen den beiden Arten von Pipes, diese hier auszuführen würde aber den Rahmen dieses Buches sprängen.