-
Eviter les Broken pipe.
Bonjour,
Je débute en réseau et je suis souvent confronter au broken pipe. Je voudrais savoir si il exsiste un moyen de les éviter. J'ai remarquer que les broken pipe survenait lorsque je tentais de write sur une socket close. Si vous avez d'autre cas de figure et des solutions a m'àpporter, se serait sympas.
Merci.
-
Bonsoir,
« broken pipe » signifie littéralement « tube brisé ». Ça veut dire que, justement, l'une des deux extrémités du tube s'est refermée de manière prématurée et que, donc, il n'est plus possible d'écrire dedans. Cela se produit dans trois grands cas de figure :
- Soit tu dialogues à travers un socket avec un client réseau et celui-ci a refermé sa connexion (ou l'a perdue) ;
- Soit la connexion elle-même est interrompue entre les deux parce que le matériel qui la véhicule a cessé de le faire (par exemple : coupure téléphonique) ;
- Soit tu as créé deux processus distincts partageant un tube (typiquement un père et un fils) et le lecteur meurt avant l'autre (par exemple, à cause d'une erreur non gérée).
Il est tout-à-fait normal que le rédacteur se termine avant le lecteur : lorsqu'il n'a plus rien à envoyer, il referme son extrémité et le lecteur est prévenu en recevant un paquet d'une longueur de zéro octet. Par contre, il n'est pas normal qu'un rédacteur qui n'a pas fini de transmettre se fasse raccrocher au nez avant la fin.
Le message « broken pipe » apparaît dans un shell lorsque ton processus a reçu le signal SIGPIPE et en est mort. Maintenant, pour éviter cela, il y a deux possibilités :
- Soit c'est bien toi qui a créé les deux processus et, dans ce cas, tu dois revoir ton lecteur pour qu'il se comporte proprement et qu'il ne referme pas son tube avant d'être certain qu'il n'y a plus rien à lire ;
- Soit tu écris un serveur réseau et, dans ce cas, c'est une éventualité que tu dois prendre en charge.
Dans cette hypothèse, tu dois écrire un handler pour le signal en question et l'enregistrer avec signal() ou sigaction(). Lorsque tu le reçois, tu dois agir en conséquence, en considérant que le tube est d'ores et déjà refermé et que c'est indépendant de ta volonté. « Agir » consiste alors à retomber sur ses pattes, à refermer le descripteur du tube ou socket concerné, faire le ménage, afficher éventuellement un message d'erreur et reprendre le cours normal du déroulement de ton programme.