eine hoffentlich systematische Erklärung:
- Ein Rohr ist eine Instanz durch das Betriebssystem verwaltet. Es hat ein einzelnes Leseende und ein einzelnes Schreibende.
- Beide Enden können durch mehrere Prozesse geöffnet werden. Es gibt aber immer noch nur eine Pfeife. Das heißt, mehrere Prozesse können sich dieselbe Leitung teilen.
- Ein Prozess, der eines der Enden geöffnet hat, enthält ein entsprechendes Dateihandle. Der Prozess kann
close()
es wieder aktiv! Wenn ein Prozess beendet wird, schließt das Betriebssystem das entsprechende Dateihandle für Sie.
- Alle beteiligten Prozesse können
close()
ihr Dateihandle, das das Leseende der Pipe darstellt. Daran ist nichts falsch, das ist eine vollkommen gute Situation.
- Wenn nun ein Prozess Daten auf das Schreibende der Pipe schreibt und das Leseende nicht mehr geöffnet wird (kein Prozess enthält eine offene Dateikennung für das Leseende), sendet ein POSIX-kompatibles Betriebssystem ein
SIGPIPE
Signal an die schreiben Prozess für sie zu wissen, dass es kein Lesegerät mehr gibt.
Dies ist der Standard-Mechanismus, mit dem das empfangende Programm kann implizit das sendende Programm sagen, dass es das Lesen gestoppt wurde. Haben Sie sich jemals gefragt, ob
cat bigfile | head -n5
liest eigentlich die gesamte bigfile? Nein, nicht, weil cat
ein SIGPIPE
Signal abfragt, sobald head
beendet wird (nach dem Lesen von 5 Zeilen von Stdin). Die wichtige Sache zu schätzen: cat
wurde entwickelt, um tatsächlich reagieren zu SIGPIPE
(das ist eine wichtige technische Entscheidung;)): Es hört auf, die Datei zu lesen und beendet. Andere Programme ignorieren SIGPIPE
(absichtlich behandeln sie diese Situation alleine - das ist in Netzwerkanwendungen üblich).
Wenn Sie das Leseende der Pipe in Ihrem Kontrollprozess geöffnet lassen, deaktivieren Sie den beschriebenen Mechanismus. dmesg
kann nicht bemerken, dass grep
beendet wurde.
Allerdings ist Ihr Beispiel eigentlich kein guter. grep hda
wird der gesamte Eingang lesen. dmesg
ist der Prozess, der zuerst beendet wird.
mögliches Duplikat von [Beispiel aus Python-Subprozessmodul erklären] (http://stackoverflow.com/questions/6046779/explain-example-from-python-subprocess-module) –