Учитывая pid процесса Linux, я хочу проверить, из программы на C, если процесс все еще запущен.
Проверьте, существует ли процесс с учетом его pid
Ответ 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.