Проверьте, существует ли процесс, учитывая его pid - PullRequest
35 голосов
/ 06 февраля 2012

Учитывая pid процесса Linux, я хочу проверить из программы на C, работает ли этот процесс.

Ответы [ 6 ]

70 голосов
/ 06 февраля 2012

Выполните системный вызов kill(2) с 0 в качестве сигнала.Если вызов успешен, это означает, что процесс с этим идентификатором pid существует.

Если вызов завершится неудачно и для errno установлено значение ESRCH, процесс с таким идентификатором не существует.

Цитирование стандарта POSIX:

Если sig равен 0 (нулевой сигнал), выполняется проверка ошибок, но сигнал фактически не отправляется.Нулевой сигнал может использоваться для проверки правильности pid.

Обратите внимание, что вы не защищены от условий гонки: возможно, что целевой процесс завершился, и другой процесс с таким же pid былначалось тем временем.Или процесс может очень быстро завершиться после того, как вы его проверите, и вы можете принять решение на основе устаревшей информации.

Только если данный pid относится к дочернему процессу (fork 'ed из текущего), вы можете использовать waitpid(2) с опцией WNOHANG или попытаться поймать SIGCHLD сигналы.Они безопасны от условий гонки, но имеют отношение только к дочерним процессам.

15 голосов
/ 06 февраля 2012

Используйте procfs.

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

Легко переносится на

  • Solaris
  • IRIX
  • Tru64 UNIX
  • BSD
  • Linux
  • IBM AIX
  • 1019 * QNX *
  • План 9 от Bell Labs
10 голосов
/ 11 августа 2015

kill(pid, 0) - это типичный подход, как сказал @ blagovest-buyukliev.Но если процесс, который вы проверяете, может принадлежать другому пользователю, и вы не хотите предпринимать дополнительные шаги, чтобы проверить, является ли errno == ESRCH, получается, что

(getpgid(pid) >= 0)

является эффективным-шаговый метод для определения того, имеет ли какой-либо процесс заданный PID (поскольку вам разрешено проверять идентификатор группы процессов даже для процессов, которые вам не принадлежат).

3 голосов
/ 20 октября 2012

Вы можете выполнить системный вызов kill(2) с 0 в качестве сигнала.

В kill -0 нет ничего небезопасного.Программа должна знать, что результат может устареть в любое время (включая то, что pid может быть повторно использован до вызова kill), и все.При использовании procfs вместо также используется pid, причем более громоздким и нестандартным способом.

0 голосов
/ 04 сентября 2016
ps -p $PID > /dev/null 2>&1;   echo $?

Эта команда возвращает 0, если процесс с $PID все еще выполняется. В противном случае возвращается 1.

Эту команду можно использовать и в терминале OSX.

0 голосов
/ 13 декабря 2013

В качестве дополнения к методу файловой системы / proc вы можете проверить / proc / / cmdline (при условии, что он был запущен из командной строки), чтобы убедиться, что это именно тот процесс, который вам нужен.

...