+1 Zu Greg Hewgill für die Leitung meines Gedankenprozesses in die richtige Richtung, um die Antwort zu finden.
Der eigentliche Grund für SIGPIPE
in Sockets und Pipes ist das Filter-Idiom/-Muster, das für typische E/A in Unix-Systemen gilt.
Beginnend mit Rohren. Filterprogramme wie grep schreiben normalerweise in STDOUT
und lesen von STDIN
, die von der Shell zu einer Pipe umgeleitet werden können. Zum Beispiel:
cat someVeryBigFile | grep foo | doSomeThingErrorProne
Die Shell, wenn er sich gabelt und dann exec diese Programme wahrscheinlich verwendet das dup2
Systemaufruf STDIN
, STDOUT
und STDERR
an die entsprechenden Leitungen umleiten.
Da das Filterprogramm grep
nicht weiß, und hat keine Möglichkeit, zu wissen, dass es Ausgang dann den einzigen Weg umgeleitet wurde, es zu sagen, zu einem Rohrbruch zu stoppen zu schreiben, wenn doSomeThingErrorProne
Abstürze mit einem Signal, da die Rückgabewerte sind von Schreiben an STDOUT
werden selten, wenn überhaupt überprüft.
Das Analog mit Sockets wäre der inetd
Server, der den Platz der Shell übernimmt.
Als Beispiel nehme ich an, Sie könnten grep
in einen Netzwerkdienst verwandeln, der über TCP
Sockets funktioniert. Zum Beispiel mit inetd
möchten, wenn Sie einen grep
Server auf TCP
Port 8000 dann fügen Sie diese /etc/services
haben:
grep 8000/tcp # grep server
Dann fügen Sie diese /etc/inetd.conf
:
grep stream tcp nowait root /usr/bin/grep grep foo
senden SIGHUP
-inetd
und eine Verbindung zum Port 8000 mit Telnet. Dies sollte dazu führen inetd
zu fork, dup den Sockel auf STDIN
, STDOUT
und STDERR
und dann exec grep
mit foo als Argument. Wenn Sie beginnen, Zeilen in Telnet grep
eingeben, werden die Zeilen, die foo enthalten.
Jetzt ersetzen telnet mit einem Programm namens ticker
, dass zum Beispiel einen Strom von Echtzeit Aktienkurse auf STDOUT
und bekommt Befehle auf STDIN
schreibt.Jemand telnet an Port 8000 und gibt "start java" ein, um Angebote für Sun Microsystems zu erhalten. Dann stehen sie auf und gehen zum Mittagessen. Telnet stürzt unerklärlicherweise ab. Wenn es keine SIGPIPE
zu senden gab, würde ticker
weiterhin für immer Zitate senden, nie wissend, dass der Prozess am anderen Ende abgestürzt war und Systemressourcen unnötig verschwendet.
Es gibt etwas anderes hier, das ziemlich subtil ist: Eine TCP-Verbindung kann halb geschlossen sein, dh eine Seite hat den Socket geschlossen (ein FIN-Paket gesendet), aber die andere Seite hat noch Daten zu senden. Wenn Sie auf dieser Ebene herumwühlen, lesen Sie bitte: http://superuser.com/questions/298919/what-is-tcp-half-open-connection-and-tcp-half-closed-connection – rbp