Подтвердить что ты не робот

Проверьте, существует ли процесс с учетом его pid

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

4b9b3361

Ответ 1

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

Если сбой вызова и errno установлен на ESRCH, процесс с таким pid не существует.

Указание стандарта POSIX:

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

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

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

Ответ 2

Использовать 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
  • QNX
  • План 9 из Bell Labs

Ответ 3

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

(getpgid(pid) >= 0)

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

ps -p $PID > /dev/null 2>&1;   echo $?

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

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