我想在c中使用main函数在后台运行子进程。我使用fork和execv函数来实现。但是我也希望在父进程结束时终止子进程,以防子进程尚未退出。我将使用kill(pChildPid)函数来执行此操作。所以我的问题是
假设子进程在父进程之前退出,linux OS是否可以将与子进程相同的pid分配给其他进程?如果是,那么我将无意中杀死这个过程?
答案 0 :(得分:4)
是的,从理论上讲,它可以,是的,你可以。
但是,如果您拥有该进程,那么它将是一个“僵尸”进程,直到您的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秒结束时,它就会消失。
答案 1 :(得分:2)
如果你分叉,你还必须为你的孩子做wait
。如果孩子在你这样做之前就退出了,它会像僵尸一样留下来。因此,如果你想要杀死孩子并且你没有等待它的返回状态,那么它将会停留并且不会采取PID。在这种情况下,你可以安全地杀死它,即使它不再具有效果,如果它不再运行。
如果你等待,然后发送杀戮,那么如果你没有看到你孩子的状态,那么可能会在同时由另一个进程采取PID。
答案 2 :(得分:1)
如果子进程退出,它将变成一个僵尸进程 - 死进程仍在运行进程表中,因此其父进程可以检索其退出代码。
答案 3 :(得分:0)
是的,PID会递增并最终循环回零 - 因此进程可以退出,并在稍后的时间运行它的PID。但你可以随时检查它的PPID,以确保它的父母。