Forum Linux.général Kill d'un processus et processus fils

Posté par  . Licence CC By‑SA.
Étiquettes : aucune
0
24
déc.
2012

Bonjour,
j'ouvre un terminal et je lance des processus depuis celui-ci sans utiliser le "&" afin qu'il se ferment lorsque le processus du terminal sera tué.
Je fais ensuite un kill sur le processus du terminal que se passe-t-il pour ses processus fils? (Ma question concerne ce qu'il va se passer en détails, je sais bien que les processus fils ne seront plus là à la fin)

Je pense qu'il se passe cela :

Le processus du terminal reçoit un signal qui lui demande de se terminer, il envoi un signal à ses processus fils leur demandant de se terminer et se termine.
Les processus fils sont immédiatement adoptés par le processus 1 (init).
Les processus fils se terminent et renvoient leur code de retour au processus init.

Es-ce bon ou fais-je une erreur? En particulier, les processus fils sont-ils bien adoptés par init avant de terminer?

  • # Ça dépend du signal

    Posté par  . Évalué à 2. Dernière modification le 24 décembre 2012 à 01:39.

    Si c'est un SIGKILL et si je ne dis pas de connerie :
    Le processus du terminal (le shell pour faire simple) ne reçoit rien du tout, le système d'exploitation l'efface simplement. Ses fils (du coup orphelins) sont rattachés à init, terminent leur exécution tranquillement, puis init peut récupérer leur valeur de retour (et rien en faire).

    Pour les SIGINT et SIGTERM je ne sais pas du tout. J'aurais tendance à imaginer ce que tu décris mais sans conviction. Ajout : et ce ne serait que le comportement par défaut.

    Please do not feed the trolls

  • # SIGHUP

    Posté par  . Évalué à 6.

    Dans le cas général, lorsqu'un processus se termine, cela se passe très simplement :
    - ses processus fils sont reparentés à init
    - ils continuent leur vie, et lorsqu'ils meurent init effectue le waitpid()

    Mais dans ton cas, c'est un peu plus complexe, à cause du tty. Lorsque le shell se termine :
    - comme le shell "controllait" le tty (controlling process, session leader), le noyau (le driver tty) envoie un SIGHUP à tous les process dans le foreground group. C'est ce signal qui provoque la terminaison des processus. Mais ce signal peut être ignoré, par exemple avec sighup, ou on peut carrément lancer les process dans une nouvelle session et sans controlling tty avec setsid.

    Notes :
    Dans tous les cas, ce n'est pas le shell lui-même qui tue les processus fils.
    C'est en fait bien plus complexe sous POSIX, mais les process groups, sessions, etc…

    Pour le minimum à savoir, tu peux voir ici : http://www.win.tue.nl/~aeb/linux/lk/lk-10.html

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.