Ein Prozess empfängt ein SIGPIPE, wenn er versucht, in eine Pipe (mit oder ohne Namen) oder einen Socket vom Typ SOCK_STREAM zu schreiben, für die kein Leser mehr vorhanden ist.
Es ist im Allgemeinen gewolltes Verhalten. Ein typisches Beispiel ist:
find . | head -n 1
Sie möchten nicht find
weiterlaufen, wenn head
das Programm beendet wurde (und dann den einzigen Dateideskriptor geschlossen hat, der zum Lesen in dieser Pipe geöffnet ist).
Der yes
Befehl verlässt sich normalerweise auf dieses Signal, um zu beenden.
yes | some-command
Schreibt "y", bis ein Befehl beendet wird.
Beachten Sie, dass dies nicht nur beim Beenden von Befehlen der Fall ist, sondern auch, wenn alle Leser ihre Lese-FD für die Pipe geschlossen haben. Im:
yes | ( sleep 1; exec <&-; ps -fC yes)
1 2 1 0
Es wird 1 (die Subshell) geben, dann 2 (Subshell + Sleep), dann 1 (Subshell) und dann 0 fd, die aus der Pipe gelesen werden, nachdem die Subshell ihre Standard-ID explizit geschlossen yes
hat. Dann wird eine SIGPIPE empfangen.
Oben verwenden die meisten Shells eine pipe(2)
Weile ksh93
a socketpair(2)
, aber in dieser Hinsicht ist das Verhalten dasselbe.
Wenn ein Prozess die SIGPIPE ignoriert, rufen Sie das Schreibsystem ( in der Regel write
, könnte aber sein pwrite
, send
, splice
...) kehrt mit einem EPIPE
Fehler. Daher ignorieren Prozesse, die die unterbrochene Leitung manuell behandeln möchten, normalerweise SIGPIPE und ergreifen Maßnahmen bei einem EPIPE-Fehler.