kill()总是返回0(成功),即使在子进程已经结束后也是如此?

问题描述 投票:0回答:1

在C++中(运行在Linux上),想做这样的事情来判断一个进程是否没有运行

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 总是返回 0而不是在子进程结束后出现错误。

我的错误在哪里?我以为 kill() 每当我在一个不存在的pid上调用它时,都会返回一个错误,但显然这是错的......。

c++ parent-child kill-process
1个回答
0
投票

即使在子进程退出后,它仍然存在(作为所谓的 "僵尸进程"),直到父进程通过调用 waitpid(2) 或其亲属之一。 当它是一个僵尸。kill(pid, 0) 在许多系统上仍然会返回0(包括 符合POSIX的系统).

所以你的父进程需要使用 waitpid() 来等待这个过程。 当 waitpid() 表示该进程已经退出,然后你可以立即采取任何适当的行动,设置一个标志来记住它的发生,等等。 这很可能是一个比试图测试孩子是否存在的更好的设计。kill(2)而且更可靠,因为PIDs可以被系统重复使用。 如果这对你有用的话,它还可以让你访问孩子的退出状态。

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

© www.soinside.com 2019 - 2024. All rights reserved.