Sur les BSD et OS X, vous pouvez utiliser kqueue avec EVFILT_PROC+NOTE_EXIT pour faire exactement cela. Aucun sondage requis. Malheureusement, il n'y a pas d'équivalent Linux.
Vous pouvez également créer un socket ou un FIFO et lire dessus. La FIFO est particulièrement simple :Connectez la sortie standard de votre enfant avec la FIFO et lisez. La lecture sera bloquée jusqu'à ce que l'enfant quitte (pour une raison quelconque) ou jusqu'à ce qu'il émette des données. Vous aurez donc besoin d'une petite boucle pour supprimer les données de texte indésirables.
Si vous avez accès à la source de l'enfant, ouvrez le FIFO pour l'écriture lorsqu'il démarre, puis oubliez-le simplement. Le système d'exploitation nettoiera le descripteur de fichier ouvert lorsque l'enfant se terminera et votre processus "parent" en attente se réveillera.
Maintenant, cela pourrait être un processus que vous n'avez pas commencé ou que vous ne possédez pas. Dans ce cas, vous pouvez remplacer l'exécutable binaire par un script qui démarre le vrai binaire mais ajoute également la surveillance comme expliqué ci-dessus.
Jusqu'à présent, j'ai trouvé trois façons de le faire sous Linux :
- Scrutation :vous vérifiez régulièrement l'existence du processus, soit en utilisant
kill
soit en testant l'existence de/proc/$pid
, comme dans la plupart des autres réponses - Utilisez le
ptrace
appel système pour s'attacher au processus comme un débogueur afin que vous soyez averti lorsqu'il se termine, comme dans la réponse d'a3nm - Utilisez le
netlink
interface pour écouterPROC_EVENT_EXIT
messages - de cette façon, le noyau indique à votre programme chaque fois qu'un processus se termine et vous attendez simplement le bon ID de processus. Je n'ai vu cette description qu'à un seul endroit sur Internet.
Prise éhontée :je travaille sur un programme (open source bien sûr ; GPLv2) qui fait l'un des trois.
Rien d'équivalent à wait()
. La pratique habituelle consiste à interroger en utilisant kill(pid, 0)
et recherche de la valeur de retour -1 et errno
de ESRCH
pour indiquer que le processus est terminé.
Mise à jour : Depuis le noyau Linux 5.3, il existe un appel système pidfd_open, qui crée un fd pour un pid donné, qui peut être interrogé pour recevoir une notification lorsque le pid est sorti.