Étant donné le pid d'un processus Linux, je veux vérifier, à partir d'un programme C, si le processus est toujours en cours d'exécution.
Émettez un appel système kill(2)
avec 0
Comme signal. Si l'appel réussit, cela signifie qu'un processus avec ce pid existe.
Si l'appel échoue et que errno
est défini sur ESRCH
, un processus avec un tel pid n'existe pas.
Citant la norme POSIX:
Si sig vaut 0 (le signal nul), une vérification d'erreur est effectuée mais aucun signal n'est réellement envoyé. Le signal nul peut être utilisé pour vérifier la validité de pid.
Notez que vous n'êtes pas à l'abri des conditions de concurrence: il est possible que le processus cible se soit arrêté et qu'un autre processus avec le même pid ait été démarré entre-temps. Ou le processus peut se terminer très rapidement après l'avoir vérifié, et vous pouvez prendre une décision basée sur des informations obsolètes.
Seulement si le pid donné est d'un processus enfant (fork
'ed à partir du processus courant), vous pouvez utiliser waitpid(2)
avec le WNOHANG
ou essayez d'attraper les signaux SIGCHLD
. Ceux-ci sont à l'abri des conditions de concurrence, mais ne concernent que les processus enfants.
Utilisez procfs.
#include <sys/stat.h>
[...]
struct stat sts;
if (stat("/proc/<pid>", &sts) == -1 && errno == ENOENT) {
// process doesn't exist
}
Facilement portable à
kill(pid, 0)
est l'approche typique, comme l'a dit @ blagovest-buyukliev. Mais si le processus que vous vérifiez peut appartenir à un autre utilisateur et que vous ne voulez pas prendre les mesures supplémentaires pour vérifier si errno == ESRCH
, il se trouve que
(getpgid(pid) >= 0)
est une méthode efficace en une étape pour déterminer si un processus a le PID donné (puisque vous êtes autorisé à inspecter l'ID du groupe de processus même pour les processus qui ne vous appartiennent pas).
Vous pouvez émettre un appel système kill(2)
avec 0
comme signal.
Il n'y a rien de dangereux à propos de kill -0
. Le programme doit être conscient que le résultat peut devenir obsolète à tout moment (y compris que le pid peut être réutilisé avant l'appel à kill), c'est tout. Et utiliser procfs à la place ne utilise aussi le pid, et ce, de manière plus lourde et non standard.
En complément de la méthode du système de fichiers/proc, vous pouvez vérifier la ligne de commande/proc/<pid>/cmd (en supposant qu'elle a été démarrée à partir de la ligne de commande) pour voir s'il s'agit du processus souhaité.