在后台运行一个进程c

我想从后台运行一个subprocess从主函数c。 我已经使用fork和execv函数来做到这一点。 但是我也想在父进程结束时终止subprocess,以防subprocess还没有退出。 我将使用kill(pChildPid)函数来执行此操作。 所以我的问题是

假设subprocess在父进程之前退出,linux操作系统是否可以将subprocess与subprocess分配给其他进程? 如果是的话,那么我会无意中杀死那个过程?

是的,理论上可以,而且可以。

但是,如果你拥有这个进程,它将会是一个“僵尸”进程,直到你的waitpid或类似的函数收到了进程死亡的消息(除非分支进程使用detach来从拥有进程断开)。

展示:

 #include <sys/wait.h> #include <sys/types.h> #include <unistd.h> #include <iostream> int main() { int pid = fork(); if (pid) { int p = 0; int status; sleep(60); p = wait(&status); std::cout << "Pid " << p << " exited..." << std::endl; } else { for(int i = 0; i < 20; i++) { std::cout << "Child is sleeping..." << std::endl; sleep(1); } std::cout << "Child exited..." << std::endl; } return 0; } 

如果你运行这个,使用ps a查看进程,你会看到a.out两次,PID彼此接近。 一旦它打印child exited ,你会看到第二个过程的状态如下所示:

 12362 pts/0 Z+ 0:00 [a.out] <defunct> 

这里Z表示这是一个“僵尸”的过程。 当第一个过程的60秒结束时,它将消失。

如果你分叉,你还必须wait你的孩子。 如果孩子在这之前就离开了,那么这个孩子将会像一个僵尸一样。 所以,如果你想杀死孩子,你没有等待它的返回状态,它会坚持,并没有采取PID。 在这种情况下,你可以安全地杀死它,即使它不再有效果,如果它不再运行。 如果你等待,然后发送杀死,那么如果你不看你的孩子的状态,可能会发生PID在另一个进程中被采取。

如果子进程退出,它将成为一个僵尸进程 – 死进程仍然在正在运行的进程表中,所以它的父进程可以检索其退出代码。

是的,PID会递增并最终循环回到零 – 因此一个进程可以退出,并在稍后使用PID进行另一次运行。 但是,你可以随时检查它的PPID,以确保你的父母。