91 votes

Quelles sont les causes de l'Erreur Broken Pipe?

Je sais que broken pipe erreur est renvoyée lorsque le support par les pairs est fermé.

Mais, dans mon test je l'ai fait remarquer qu'une "envoyer" appel de ce côté si le pair est fermé n'a pas toujours conduit à un bris de tuyau d'erreur.

Par Ex:

Après la fermeture de la socket sur le peer côté (j'ai essayé de nettoyer la fermeture en appelant à proximité et aussi anormal de clôture en tuant les pairs), si j'essaie d'envoyer 40 octets, alors je ne suis pas un bris de tuyau, mais, si j'essaie d'envoyer 40000 octets puis il donne immédiatement cassé la pipe d'erreur.

Ce qui cause exactement broken pipe et peut-il le comportement de prédire?

67voto

Jonathan Leffler Points 299946

Il peut prendre du temps pour le réseau proche d'être observé - le temps total est théoriquement environ 2 minutes (oui, les minutes!) après un proche avant que les paquets destinés au port sont tous supposés être morts. La condition d'erreur est détecté à un certain point. Avec une petite écrire, vous êtes à l'intérieur de la MTU du système, de sorte que le message est en attente de l'envoi. Avec un grand écrire, vous êtes plus grand que le MTU et le système de spots le problème plus rapidement. Si vous ignorez le signal SIGPIPE, puis les fonctions seront de retour EPIPE erreur sur un bris de tuyau - à un certain point, lorsque le cassé ness de la connexion est détectée.

12voto

Vikram.exe Points 2602

L'état actuel d'un socket est déterminée par "keep-alive" de l'activité. Dans votre cas, cela n'est possible que lorsque vous êtes à l'émission de l' send appel, l' keep-alive de l'activité indique que le support est actif et donc l' send appel d'écrire les données requises (40 octets) dans le tampon, et revient avec une donnant toute erreur.

Lorsque vous envoyez un plus gros morceau, le envoyer l'appel va dans le blocage de l'état.

Envoyer la page de manuel confirme également ce:

Lorsque le message ne rentre pas dans le tampon d'envoi de la socket send() bloque normalement, à moins que le socket a été placé en non-blocage I/O mode. En mode sans blocage, il serait de retour EAGAIN dans ce cas

Ainsi, alors que le blocage de la libre disposition de la mémoire tampon, si l'appelant est informé (par keep-alive mécanisme) que l'autre extrémité n'est plus présente, l'envoyer appel échouera.

Prédire le scénario exact est difficile à l'info, mais je crois que cela doit être la raison de votre problème.

3voto

Joel Points 3356

Peut-être les 40 octets s'inscrit dans le tuyau de la mémoire tampon, et l'40000 octets ne l'est pas?

Edit:

Le processus d'envoi est envoyé un SIGNAL de signal lorsque vous essayez d'écrire de la fermeture d'une pipe. Je ne sais pas exactement quand le signal est envoyé, ou ce que l'effet de la conduite de la mémoire tampon a sur ce. Vous pouvez peut-être récupérer par le piégeage du signal avec la sigaction appel.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X