Zwei Fenster, derselbe Benutzer, mit Bash-Eingabeaufforderungen. Geben Sie in Fenster 1 Folgendes ein:
$ mkfifo f; exec <f
Bash versucht nun, aus dem Dateideskriptor 0 zu lesen, der der Named Pipe zugeordnet ist f
. Geben Sie in Fenster 2 Folgendes ein:
$ echo ls > f
Jetzt druckt Fenster 1 ein ls und dann stirbt die Shell. Warum?
Nächstes Experiment: Öffnen Sie Fenster-1 erneut mit exec <f
. Geben Sie in Fenster 2 Folgendes ein:
$ exec 3>f
$ echo ls >&3
Nach der ersten Zeile oben wird Fenster 1 aktiviert und eine Eingabeaufforderung gedruckt. Warum? Nach der zweiten Zeile oben druckt Fenster-1 die ls
Ausgabe und die Shell bleibt am Leben. Warum? Tatsächlich schließt jetzt in Fenster-2 echo ls > f
die Fenster-1-Shell nicht.
Die Antwort muss mit der Existenz des Dateideskriptors 3 aus Fenster 2 zu tun haben, der auf die Named Pipe verweist?!
exec 3>f
die erste Shell nach dem Ausführen eine Eingabeaufforderung ausgibt. (Kleiner Punkt,
exec <f
,bash
nicht versucht , lesen ausf
, wird zunächst versucht , öffnen es. Dasopen()
wird erst zurückkehren, wenn ein Prozess ein weiteres Öffnen im Schreibmodus für die Pipe ausführt (an diesem Punkt wird die Pipe instanziiert und die Shell liest Eingaben von ihr).