Heim > Artikel > Computer-Tutorials > Linux SIGPIPE-Signal
In den TCP-Kommunikationsparteien werden die Kommunikationsparteien der Einfachheit halber im Folgenden durch A und B ersetzt.
Wenn B gemäß dem TCP-Protokoll weiterhin Daten sendet, nachdem A die Verbindung geschlossen hat, erhält B die RST-Antwort von A. Wenn B weiterhin Daten sendet, sendet das System ein SIGPIPE-Signal, um darüber zu informieren, dass die Verbindung getrennt wurde, und stoppt das Senden.
Das Standardverarbeitungsverhalten des Systems für das SIGPIPE-Signal besteht darin, Prozess B beenden zu lassen.
Das Standardverarbeitungsverhalten des Betriebssystems für das SIGPIPE-Signal ist sehr unfreundlich, lassen Sie es uns analysieren.
TCP-Kommunikation ist ein Vollduplex-Kanal, der zwei Simplex-Kanälen entspricht, und jedes Ende der Verbindung ist für einen verantwortlich.
Wenn der Peer „schließt“, obwohl die Absicht besteht, alle beiden Kanäle zu schließen, empfängt das lokale Ende nur das FIN-Paket.
Gemäß den Bestimmungen des TCP-Protokolls kann ein Ende, wenn es den Einwegkanal schließt, für den es verantwortlich ist, weiterhin Daten empfangen, aber keine Daten mehr senden.
Mit anderen Worten: Aufgrund der Einschränkungen des TCP-Protokolls kann die kommunizierende Partei nicht wissen, ob der Socket des Peers „Close“ oder „Shutdown“ aufgerufen hat.
int shutdown(int socket, int how);
Der Parameter „how“ der Shutdown-Funktion kann so eingestellt werden, dass SHUT_RD, SHUT_WR oder SHUT_RDWR geschlossen werden. Dies dient dazu, das Schließen der Empfangs- und Sendekanäle einzeln oder das gleichzeitige Schließen der Sende- und Empfangskanäle anzugeben.
Rufen Sie die read/recv-Methode für einen Socket auf, der ein FIN-Paket empfangen hat. Wenn der Empfangspuffer leer ist, wird 0 zurückgegeben, was oft darauf hinweist, dass die Verbindung geschlossen ist. Wenn die Schreib-/Sendemethode jedoch zum ersten Mal aufgerufen wird und kein Problem mit dem Sendepuffer vorliegt, wird das korrekte Schreiben zurückgegeben (dh der Rückgabewert der Schreib-/Sendefunktion ist größer als 0), aber Die gesendete Nachricht führt dazu, dass der Peer mit einer RST-Nachricht antwortet. Denn als das Programm das letzte Mal die Schreib-/Sendefunktion aufrief, war es normal, dass beim erneuten Aufrufen der Schreib-/Sendefunktion das SIGPIPE-Signal generiert wurde, wodurch der Prozess beendet wurde.
Dieses Standardverhalten dient der Entwicklung von Programmen, insbesondere für Back-End-Dienste, die viele Clients gleichzeitig bedienen müssen. Der gesamte Prozess kann nicht beendet werden und kann nicht weiterhin andere Clients bedienen, da ein Problem mit der Verbindung besteht ein bestimmter Kunde.
Um dieses Phänomen zu vermeiden, können Sie das SIGPIPE-Signal erfassen und verarbeiten oder das Signal ignorieren. Der Code zum Ignorieren des Signals lautet wie folgt:
signal(SIGPIPE, SIG_IGN);
Nach einer solchen Einstellung wird beim zweiten Aufruf der Schreib-/Sendemethode -1 zurückgegeben und der Fehlercode „errno“ wird auf SIGPIPE gesetzt, sodass das Programm weiß, dass der Peer geschlossen wurde.
Das obige ist der detaillierte Inhalt vonLinux SIGPIPE-Signal. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!