POSIX 确定具有特定 PID 的进程是否存在的合规方式

POSIX compliant way to find out if a process with a certain PID is alive

我从 https://serverfault.com/q/366474 了解到以下代码是一种符合 POSIX 的测试 PID = $pid 的进程是否存在的方法。它使用 kill -0 命令。

# First code sample
pid=100

if kill -0 "$pid" 2> /dev/null
then
    echo PID "$pid" is alive.
else
    echo PID "$pid" not found.
fi

pid=100

我学到的另一种方法是使用 ps -p 命令。

# Second code sample
if ps -p "$pid" > /dev/null
then
    echo PID "$pid" is alive.
else
    echo PID "$pid" not found.
fi

我一直在尝试确定使用 kill -0 命令的第一个代码示例是否确实符合 POSIX 标准。我发现最支持它的是 http://pubs.opengroup.org/onlinepubs/9699919799/utilities/kill.html 的 'EXIT STATUS' 和 'RATIONALE' 部分中的语句。重点是我加的。

EXIT STATUS

The following exit values shall be returned:

0 At least one matching process was found for each pid operand, and the specified signal was successfully processed for at least one matching process.

>0 An error occurred.

RATIONALE

...

...

An early proposal invented the name SIGNULL as a signal_name for signal 0 (used by the System Interfaces volume of POSIX.1-2008 to test for the existence of a process without sending it a signal). Since the signal_name 0 can be used in this case unambiguously, SIGNULL has been removed.

但我一直无法在 POSIX.1-2008.

的系统接口卷中找到对此的提及

对于第二个代码示例,我在 http://pubs.opengroup.org/onlinepubs/9699919799/utilities/ps.html 没有发现任何东西,如果 ps -p "$pid" 找不到具有匹配 $pid 的进程,则退出状态将大于零=]命令。

这是我的问题。

  1. 第一个代码示例真的是一种符合 POSIX 的方式来查明 PID = $pid 的进程是否确实存在吗?
  2. 能否请您指向 POSIX.1-2008 系统接口卷中的相应页面和部分,我可以在其中找到记录的信号 0 的行为?
  3. 第二个代码示例是否符合 POSIX 的方式来查明 PID = $pid 的进程是否存活?

来自 kill(1p) 手册页:

SYNOPSIS
   kill -s signal_name pid ...

   kill -l [exit_status]

   kill [-signal_name] pid ...

   kill [-signal_number] pid ...

 ...

   -signal_number

          Specify a non-negative decimal  integer,  signal_number,  repre‐
          senting  the  signal  to  be used instead of SIGTERM, as the sig
          argument in the effective call  to  kill().  The  correspondence
          between  integer  values  and the sig value used is shown in the
          following table.

   The effects of specifying any signal_number other than those listed  in
   the table are undefined.

                          signal_number   sig Value
                          0               0
                           ...

 ...

SEE ALSO
   Shell Command Language, ps, wait(), the  System  Interfaces  volume  of
   IEEE Std 1003.1-2001,   kill(),   the   Base   Definitions   volume  of
   IEEE Std 1003.1-2001, <signal.h>

来自 kill(3p) 手册页:

SYNOPSIS
   #include <signal.h>

   int kill(pid_t pid, int sig);

DESCRIPTION
   The kill() function shall send a signal to a process or a group of pro‐
   cesses  specified by pid. The signal to be sent is specified by sig and
   is either one from the list given in <signal.h> or 0. If sig is 0  (the
   null  signal),  error  checking  is performed but no signal is actually
   sent. The null signal can be used to check the validity of pid.

 ...

SEE ALSO
   getpid(), raise(), setsid(), sigaction(), sigqueue(), the Base  Defini‐
   tions volume of IEEE Std 1003.1-2001, <signal.h>, <sys/types.h>

编辑:

  1. 是的。 POSIX 指定信号 0 将从 kill 透明传递到 kill() 以及信号 0 的作用。

  2. kill() function描述的第一段。

  3. POSIX 指定 ps 的非零 return 状态意味着 "an error occurred",但 不是 指定没有匹配给定参数的命令是错误的。因此,第二段代码的行为应该被认为是系统特定的。