我希望能够在 c 的主函数中运行一个子进程。我已经使用了 fork 和 execv 函数来实现这一点。但是,在父进程结束时,如果子进程尚未退出,我还想杀死后台的子进程。为此,我将使用 kill(pChildPid)函数。所以我的问题是:如果子进程在父进程之前退出,Linux 操作系统会分配相同的 pid 给其他进程吗?如果是的话,那么我将会无意中杀死该进程吗?
理论上讲是可以的,而且你也能做到。
不过,如果你拥有这个进程,它会一直是一个“僵尸”进程,除非你使用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
操作。如果子进程在您执行wait
操作之前退出,则会变成僵尸进程。因此,如果您想杀死子进程,并且没有等待其返回状态,那么它将继续存在,PID不会被占用。在这种情况下,即使子进程已经停止运行,您仍然可以安全地杀死它,但不会产生任何效果。wait
操作,然后稍后发送了杀死命令,那么在此期间,PID可能已被其他进程占用,如果您不查看子进程的状态。如果子进程退出了,它将成为僵尸进程-已经死亡的进程,但仍在运行进程表中,因此其父进程可以检索其退出代码。
是的,PIDs会递增并最终循环回零 - 因此进程可以退出,并在以后的某个时间再次运行。但您始终可以检查其PPID以确保它的父级。