在Linux 中判断一个PID 对应的进程是否存在,可以通过如下进行判断
#! /usr/bin/env python
import os
def check_pid(pid):
try:
os.kill(pid,0)
except OSError:
return False
else:
return True
if __name__ == "__main__":
print check_pid(22467)
如果PID在系统中存在,将返回True , 否则返回False。
为什么向对应的pid 进程发生 0 信号(其实没有这个信号的 。kill -l 可以确认没有这个编号的信号) 能够判断 Pid 对应的进程是否存在呢 ?
在linux 系统中, man 手册帮助了我们。
man 2 kill 截获如下一部分
KILL(2) Linux Programmer's Manual KILL(2)
NAME
kill - send signal to a process
SYNOPSIS
#include <sys/types.h>
#include <signal.h>
int kill(pid_t pid, int sig);
Feature Test Macro Requirements for glibc (see feature_test_macros(7)):
kill(): _POSIX_C_SOURCE
DESCRIPTION
The kill() system call can be used to send any signal to any process group or process.
If pid is positive, then signal sig is sent to the process with the ID specified by pid.
If pid equals 0, then sig is sent to every process in the process group of the calling process.
If pid equals -1, then sig is sent to every process for which the calling process has permission to
send signals, except for process 1 (init), but see below.
If pid is less than -1, then sig is sent to every process in the process group whose ID is -pid.
If sig is 0, then no signal is sent, but existence and permission checks are still performed; this
can be used to check for the existence of a process ID or process group ID that the caller is permit‐
ted to signal.
For a process to have permission to send a signal, it must either be privileged (under Linux: have
the CAP_KILL capability in the user namespace of the target process), or the real or effective user
ID of the sending process must equal the real or saved set-user-ID of the target process. In the
case of SIGCONT, it suffices when the sending and receiving processes belong to the same session.
(Historically, the rules were different; see NOTES.)