在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上调用它时,都会返回一个错误,但显然这是错的......。
即使在子进程退出后,它仍然存在(作为所谓的 "僵尸进程"),直到父进程通过调用 waitpid(2)
或其亲属之一。 当它是一个僵尸。kill(pid, 0)
在许多系统上仍然会返回0(包括 符合POSIX的系统).
所以你的父进程需要使用 waitpid()
来等待这个过程。 当 waitpid()
表示该进程已经退出,然后你可以立即采取任何适当的行动,设置一个标志来记住它的发生,等等。 这很可能是一个比试图测试孩子是否存在的更好的设计。kill(2)
而且更可靠,因为PIDs可以被系统重复使用。 如果这对你有用的话,它还可以让你访问孩子的退出状态。
注意,至少在我的系统中。pidof
不报告僵尸进程,所以这也可以解释为什么你没有看到它。