Un processus reçoit un SIGPIPE lorsqu'il tente d'écrire sur un canal (nommé ou non) ou un socket de type SOCK_STREAM qui n'a plus de lecteur.
C'est généralement un comportement recherché. Un exemple typique est:
find . | head -n 1
Vous ne voulez find
pas continuer à courir une fois head
terminé (puis fermé le seul descripteur de fichier ouvert pour la lecture sur ce canal).
La yes
commande s'appuie généralement sur ce signal pour se terminer.
yes | some-command
Écrira "y" jusqu'à ce que la commande some se termine.
Notez que ce n'est pas seulement quand les commandes se terminent, c'est quand tous les lecteurs ont fermé leur lecture fd au pipe. Dans:
yes | ( sleep 1; exec <&-; ps -fC yes)
1 2 1 0
Il y aura 1 (le sous-shell), puis 2 (sous-shell + sommeil), puis 1 (sous-coque) puis 0 fd lecture du tuyau après que le sous-shell ferme explicitement son stdin, et c'est alors yes
que recevra un SIGPIPE.
Ci-dessus, la plupart des shells utilisent un pipe(2)
certain temps ksh93
utilise un socketpair(2)
, mais le comportement est le même à cet égard.
Lorsqu'un processus ne tient pas compte du SIGPIPE, l'appel système d'écriture ( en général write
, mais pourrait être pwrite
, send
, splice
...) revient avec une EPIPE
erreur. Ainsi, les processus souhaitant gérer manuellement le tuyau cassé ignoreraient généralement SIGPIPE et prendraient des mesures en cas d'erreur EPIPE.