我想从 c 中的 main 函数在后台运行一个子进程。我已经使用 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
为你的孩子做一个。如果孩子在您执行此操作之前退出,它将保持僵尸状态。因此,如果您想杀死孩子并且您没有等待它的返回状态,它会一直存在并且不会占用 PID。在这种情况下,您可以安全地杀死它,即使它不再起作用,如果它不再运行。如果您等待,然后发送终止,如果您不查看孩子的状态,则可能会发生 PID 在此期间被另一个进程占用。
如果子进程退出,它就变成了一个僵尸进程——死进程,它仍然在运行进程表中,所以它的父进程可以检索它的退出代码。
是的,PID 会递增并最终循环回零 - 因此一个进程可以退出并在稍后使用它的 PID 运行另一个进程。但是您始终可以检查它的 PPID 以确保您的它是父级。