web-dev-qa-db-fra.com

Vérifiez si le processus existe compte tenu de son pid

É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.

35
Simone

É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.

70
Blagovest Buyukliev

Utilisez procfs.

#include <sys/stat.h>
[...]
struct stat sts;
if (stat("/proc/<pid>", &sts) == -1 && errno == ENOENT) {
  // process doesn't exist
}

Facilement portable à

  • Solaris
  • IRIX
  • Tru64 UNIX
  • BSD
  • Linux
  • IBM AIX
  • QNX
  • Plan 9 de Bell Labs
15
Janus Troelsen

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).

12
the paul

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.

3
Hallvard

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é.

0
Kinthelt