A tip to see if the PID process exists

Keywords: Linux Python glibc less

In Linux, to judge whether a PID corresponding process exists, you can judge it as follows

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

Returns True if the PID exists in the system, False otherwise.

Why does the zero signal occur to the corresponding Pid process (in fact, there is no such signal. kill -l can confirm that there is no signal of this number) can determine whether the process corresponding to the Pid exists?

In linux system, man manual helps us.

man 2 kill intercepts 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.)

Posted by banjax on Tue, 19 May 2020 07:52:33 -0700