A little trick to check if the PID process exists

To judge whether the process corresponding to a PID exists in Linux, you can judge by the following

#! /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)

If the PID exists in the system, it will return True, otherwise it will return False.

Why is a 0 signal generated to the corresponding pid process (in fact, there is no such signal. kill -l can confirm that there is no signal with this number) can determine whether the process corresponding to the Pid exists?

In the Linux system, the man manual helped us.

man 2 kill intercepted the following part

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

 

Guess you like

Origin blog.csdn.net/qingzhuyuxian/article/details/106200900