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
不会报告僵尸进程,所以这也可以解释为什么您在那里没有看到它。
在 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
不会报告僵尸进程,所以这也可以解释为什么您在那里没有看到它。