kill() 总是返回 0(成功),即使在子进程已经结束之后?
kill() does always return 0 (sucess), even after child process has already ended?
在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
不会报告僵尸进程,因此这也解释了为什么您没有在那里看到它。
相关文章:
- 终止 QProcess 不会终止子进程
- 什么时候最好在子进程中使用 CPU 或 I/O 密集型代码 [ C++ ]
- 子进程更新共享 mmap 内存,但父进程没有更改
- 使用 waitpid 时等待子进程终止
- 使用重定向标准处理子进程中的 kbhit
- 由 JOB 中的进程启动的子进程是否可以将 JOB 属性设置为脱离作业?
- 是否可以将子进程的 stdout 重定向到父进程中的另一个文件?
- kill() 总是返回 0(成功),即使在子进程已经结束之后?
- 父进程和子进程之间的 POSIX 信号量
- 检测到由于操作系统内存不足而导致子进程终止
- 使用system()创建独立的子进程
- 从stdin读取时子进程挂起(fork/dup2竞争条件)
- 在 Bash 脚本中处理来自子进程的信号
- Qt C++ - 如何成功将数据传递给子进程?
- C++ 窗口本地系统模拟在子进程中失败
- 将类型化数组写入子进程 stdin 无法正常工作
- 将 nodejs 脚本作为子进程执行(而不是从其他脚本执行)
- 使用信号检测子进程何时终止的最佳方法是什么?
- 等待等待失效的子进程
- 如何在Windows上通过QProcess启动提升的子进程?