GNU/Linux >> Tutoriels Linux >  >> Linux

Détecter la mort du processus parent

Si les processus parent et enfant sont sous votre contrôle pendant toute leur durée de vie, la méthode la plus portable consiste à partager la moitié d'un tube ou d'un socket avec le parent.

  1. Avant de bifurquer, ouvrez un pipe() ou socketpair().
  2. Après la bifurcation,
    1. dans le parent, fermez l'extrémité de lecture du tube ou le premier socket.
    2. dans l'enfant, fermez l'extrémité d'écriture du tube ou le second socket.
  3. Dans le parent, rangez le descripteur de fichier restant et oubliez-le.
  4. Dans l'enfant, utilisez l'une des méthodes d'E/S multiplexées (select, poll, etc.) pour tester la lisibilité du descripteur
  5. Si le descripteur devient lisible, le parent est presque certainement mort, ou un bogue rare a provoqué une écriture parasite, que vous pouvez vérifier en appelant read(). Si le parent était vraiment mort, read() renverra 0 octet.

L'avantage de cette méthode est qu'elle évite complètement les signaux, qui sont l'un des mécanismes les plus difficiles à maîtriser sous UNIX, et fournit un descripteur d'attente qui peut facilement être intégré à un multiplexeur réseau ou à une boucle d'événement GUI.


Vous pouvez obtenir l'identifiant du processus parent en appelant getppid() puis en envoyant le signal 0 via kill() . Un code de retour de 0 indiquera que le processus est toujours actif.

Comme mentionné par @Ariel, getppid() renverra soit le pid du parent d'origine, soit celui de init, qui sera le pid 1. Vous devez donc soit stocker le pid parent en appelant getppid() au démarrage ou plus tard, vérifiez si votre parent a le pid 1.

Selon cette réponse sur Linux, vous pouvez également détecter la mort du parent via prctl() est PR_SET_PDEATHSIG option et un signal choisi par vous-même.


Linux
  1. Comment faire mourir le processus enfant après la sortie du parent?

  2. Est-il possible de changer l'environnement d'un processus parent en Python ?

  3. Comment définir le répertoire de travail du processus parent ?

  4. Différence entre SIGKILL SIGTERM compte tenu de l'arborescence des processus

  5. Le processus enfant reçoit le SIGINT du parent

Comment afficher les PPID sous Linux

Nouveau processus parent lorsque le processus parent meurt ?

Substitution de processus et tuyau ?

Tuyau B à D ? – A &&B || C | RÉ?

Comment la copie sur écriture dans fork() gère-t-elle plusieurs fourches ?

Comment tuer un processus <defunct> avec le parent 1