kill() 总是 return 0(成功),即使在子进程已经结束之后?

kill() does always return 0 (sucess), even after child process has already ended?

在 C++ 中(运行ning on Linux),想要做这样的事情来确定一个进程是否 运行ning

bool isnotrunning(pid_t pidnr)
{ 
  if(pidnr <= 0) return true; 
  if(kill(pidnr,0) == 0) return false;
  return true;
} 

然后在我的主要,我做

pid_t myPid = -1;

while(1) {
  if(isnotrunning(myPID) {
     myPid = fork();
     if(myPid == 0) { /*Do something in child process*/ return 0; }
   }
}

基本上只是再次启动子进程,如果它已经结束。
while()中的第一个运行起作用了,子进程启动了,但是结束后,没有再启动第二次。我可以看到(在带有 pidof myApplicationName 的终端中),它启动了(2 个 pid),然后结束了(又是 1 个 pid),我发现 kill pidOfFirstChild 总是 return 0,而不是子进程结束后报错。

我的错误是什么?我以为 kill() 每次我在一个不存在的 pid 上调用它时都会 return 一个错误,但显然这是错误的...

即使在 child 进程退出后,它仍然存在(作为 so-called "zombie process")直到 parent 通过调用 "reaped" 它waitpid(2) 或其亲属之一。当它是僵尸时,kill(pid, 0) 在许多系统(包括 POSIX-compliant systems)上仍将是 return 0。

所以你的parent进程需要使用waitpid()等待进程。当 waitpid() 指示进程已退出时,您可以立即采取任何适当的操作,设置一个标志以记住它发生了,等等。这可能是一个比尝试测试 child 与 kill(2) 的存在,并且也更可靠,因为 PID 可以被系统重用。如果这对您有用,它还可以让您访问 child 的退出状态。

请注意,至少在我的系统上,pidof 不会报告僵尸进程,所以这也可以解释为什么您在那里没有看到它。