Was kann die Ursache für eine spontane EPIPE Fehler ohne Ende Aufruf von close() oder Absturz?

Ich habe eine Anwendung, die besteht aus zwei Prozessen (nennen wir Sie A und B), die miteinander verbunden sind durch die Unix-domain-sockets. Die meisten der Zeit, es funktioniert gut, aber einige Nutzer berichten das folgende Verhalten:

  1. A sendet eine Anfrage an B. Dies funktioniert. Einer beginnt nun das Lesen der Antwort von B.
  2. B sendet eine Antwort auf A. Die entsprechende write () - Aufruf gibt einen Fehler EPIPE, und als ein Ergebnis B close() der socket. Jedoch hat nicht close() der socket, noch war es ein Absturz.
  3. Eine read () - Aufruf gibt 0 zurück, der angibt, das Ende der Datei. A denkt, dass B vorzeitig die Verbindung geschlossen.

Benutzer haben auch berichtet, Abweichungen von diesem Verhalten, z.B.:

  1. A sendet eine Anfrage an B. Dies funktioniert teilweise, aber vor der gesamten Anfrage gesendet wird, ist Ein write () - Aufruf zurückgegeben wird EPIPE, und als Ergebnis wird eine close () - socket. Aber B nicht close() der socket, noch war es ein Absturz.
  2. B liest eine partielle Anfrage und dann wird plötzlich ein EOF.

Das problem ist, ich kann nicht reproduzieren dieses Verhaltens lokal auf allen. Ich habe versucht, OS X und Linux. Die Benutzer sind auf eine Vielzahl von Systemen, meist Linux und OS X.

Dinge habe ich bereits versucht und geprüft:

  • Doppel-close () - bugs (close() aufgerufen wird zweimal auf die gleiche Datei-Deskriptor): wahrscheinlich nicht, denn das würde das Ergebnis in EBADF Fehler, aber ich habe Sie nicht mehr gesehen.
  • Erhöhung der maximalen Datei-Deskriptor-Grenze. Ein Benutzer berichtet, dass dies für ihn gearbeitet, der rest berichtete, dass es nicht.

Was kann sonst möglicherweise zu Verhalten wie diese? Ich weiß, für bestimmte, dass weder A noch B close() der socket-vorzeitig, und ich weiß sicher, dass keiner von Ihnen abgestürzt, weil sowohl A als auch B in der Lage waren, um den Fehler zu melden. Es ist, als ob der kernel plötzlich beschlossen, ziehen Sie den Netzstecker aus der Steckdose für einige Grund.

InformationsquelleAutor Hongli | 2010-02-10
Schreibe einen Kommentar