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.
- Avant de bifurquer, ouvrez un pipe() ou socketpair().
- Après la bifurcation,
- dans le parent, fermez l'extrémité de lecture du tube ou le premier socket.
- dans l'enfant, fermez l'extrémité d'écriture du tube ou le second socket.
- Dans le parent, rangez le descripteur de fichier restant et oubliez-le.
- Dans l'enfant, utilisez l'une des méthodes d'E/S multiplexées (select, poll, etc.) pour tester la lisibilité du descripteur
- 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.