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

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

本文关键字:子进程 之后 结束 返回 kill 成功      更新时间:2023-10-16

在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,而不是子进程结束后的错误。

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

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

因此,您的父进程需要使用waitpid()来等待该进程。 当waitpid()指示进程已退出时,您可以立即采取任何适当的操作,设置标志以记住它已发生等。 这可能比试图用kill(2)测试孩子的存在更好,而且也更可靠,因为PID可以被系统重用。 它还可以让您访问孩子的退出状态(如果这对您有用(。

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