Envoi de SIGINT du clavier vers les commandes rediffusées dans bash

Si en bash je lance a | b | c | d a | b | c | d a | b | c | d sur la ligne de commande puis appuyez sur ^ C , quel processus obtient le signal?

En bref, ils font tous.

Lors de la configuration d’un pipeline, le shell crée un groupe de processus . ^ C est interprété par la discipline de ligne du kernel comme demande de l’utilisateur d’interrompre le groupe de processus en cours d’exécution au premier plan. L’envoi d’un signal tel que SIGINT à un groupe de processus transmet automatiquement le signal à tous les processus du groupe.

J’aime mieux l’expérimentation:

 #!/bin/bash # FILE /tmp/bla.sh # trap ctrl-c and call ctrl_c() trap ctrl_c INT MY_ID=$1 # Identifier for messages function ctrl_c() { echo >&2 "GOODBYE $MY_ID" exit } # This will continue until interrupted, eg if the input/output get closed cat # If we somehow got to the end echo >&2 "grace $MY_ID" 

Les enchaîner, les courir et les briser

 nitz@mars:~$ /tmp/bla.sh 1 | /tmp/bla.sh 2 ^CGOODBYE 2 GOODBYE 1 0 

Comme vous pouvez le voir, les deux exécutions ont reçu le signal d’interruption, ce qui signifie qu’elles sont toutes tuées. De plus, l’ordre dans lequel ils ont été supprimés est aléatoire, par exemple:

 nitz@mars:~$ /tmp/bla.sh 1 | /tmp/bla.sh 2 | /tmp/bla.sh 3 | /tmp/bla.sh 4 ^CGOODBYE 2 GOODBYE 4 GOODBYE 1 GOODBYE 3