GNU/Linux >> Tutoriels Linux >  >> Linux

Pourquoi Sigint n'est-il pas propagé au processus enfant lorsqu'il est envoyé à son processus parent ?

Étant donné un processus shell (par exemple, sh ) et son processus enfant (par exemple cat ), comment puis-je simuler le comportement de Ctrl +C en utilisant l'ID de processus du shell ?

Voici ce que j'ai essayé :

Exécution de sh puis cat :

[[email protected] ~]$ sh
sh-4.3$ cat
test
test

Envoi de SIGINT à cat depuis un autre terminal :

[[email protected] ~]$ kill -SIGINT $PID_OF_CAT

cat a reçu le signal et s'est terminé (comme prévu).

L'envoi du signal au processus parent ne semble pas fonctionner. Pourquoi le signal n'est-il pas propagé à cat lorsqu'il est envoyé à son processus parent sh ?

Cela ne fonctionne pas :

[[email protected] ~]$ kill -SIGINT $PID_OF_SH

Réponse acceptée :

Comment CTRL +C fonctionne

La première chose est de comprendre comment CTRL +C fonctionne.

Lorsque vous appuyez sur CTRL +C , votre émulateur de terminal envoie un caractère ETX (fin de texte / 0x03).
Le TTY est configuré de telle sorte que lorsqu'il reçoit ce caractère, il envoie un SIGINT au groupe de processus de premier plan du terminal. Cette configuration peut être visualisée en faisant stty -a et en regardant intr = ^C; .
La spécification POSIX indique que lorsque INTR est reçu, il doit envoyer un SIGINT au groupe de processus de premier plan de ce terminal.

Quel est le groupe de processus de premier plan ?

Donc, maintenant la question est, comment déterminez-vous ce qu'est le groupe de processus de premier plan ?
Le groupe de processus de premier plan est simplement le groupe de processus qui recevra tous les signaux générés par le clavier (SIGTSTP, SIGINT, etc.).

Le moyen le plus simple de déterminer l'ID du groupe de processus consiste à utiliser ps :

ps ax -O tpgid

La deuxième colonne sera l'ID du groupe de processus.

Comment puis-je envoyer un signal au groupe de processus ?

Maintenant que nous connaissons l'ID du groupe de processus, nous devons simuler le comportement POSIX consistant à envoyer un signal à l'ensemble du groupe.

Cela peut être fait avec kill en mettant un - devant l'ID de groupe.
Par exemple, si votre ID de groupe de processus est 1234, vous utiliserez :

kill -INT -1234

Simuler CTRL +C en utilisant le numéro du terminal.

Ainsi, ce qui précède explique comment simuler CTRL +C comme un processus manuel. Mais que se passe-t-il si vous connaissez le numéro TTY et que vous souhaitez simuler CTRL +C pour ce terminal ?

Cela devient très facile.

En relation :Bash convertit \xC3\x89 en É ?

Supposons $tty est le terminal que vous souhaitez cibler (vous pouvez l'obtenir en exécutant tty | sed 's#^/dev/##' dans le terminal).

kill -INT -$(ps h -t $tty -o tpgid | uniq)

Cela enverra un SIGINT à n'importe quel groupe de processus de premier plan de $tty est.
 


Linux
  1. Pourquoi le CD n'est-il pas un programme ?

  2. Nouveau processus parent lorsque le processus parent meurt ?

  3. Comment démarrer un processus dans son propre groupe de processus ?

  4. Pourquoi le processus enfant est-il toujours en vie après la suppression du processus parent sous Linux?

  5. Comment obtenir un processus enfant à partir d'un processus parent

Quand setsid() est-il utile ou pourquoi devons-nous regrouper les processus sous Linux ?

Bash :Pourquoi le script parent ne se termine-t-il pas sur SIGINT lorsque le script enfant piège SIGINT ?

Pourquoi ne puis-je pas tuer ce processus sous Linux ?

Quand le système envoie-t-il un SIGTERM à un processus ?

Lorsqu'un processus bifurque, sa mémoire virtuelle ou résidente est-elle copiée ?

Pourquoi n'ai-je pas de coloration syntaxique lorsque je sudo vi <filename> ?