你真的理解孤儿进程吗

693 阅读3分钟

​​

上一篇文章讲过僵尸进程,这里再分享给大家另外一种状态。

孤儿进程

什么是孤儿进程?
当一个子进程还在执行时,它的父进程已经退出了,那么这个子进程的退出信息也没有被父进程接收到,如果子进程的退出信息没有被别的进程接收到,那么这个子进程就会变成一个僵尸进程,所以孤儿进程可能会引发僵尸进程。所以这个子进程必须被其他进程所领养,领养它的进程为1号进程,则它的退出信息会被1号进程所接收。
如果父进程退出,父进程会变成僵尸进程吗?
不会,因为父进程的父进程为bash,父进程的退出信息会由bash接收到,这些我们看不到。

我们这里再重温下僵尸进程和孤儿进程:

僵尸进程:

一个进程使用fork创建子进程,如果子进程退出,而父进程并没有调用wait或waitpid获取子进程的状态信息,那么子进程的进程描述符仍然保存在系统中。

这种进程称之为僵死进程。

孤儿进程:一个父进程退出,而它的一个或多个子进程还在运行,那么那些子进程将成为孤儿进程。孤儿进程将被init进程(进程号为1)所收养,并由init进程对它们完成状态收集工作。

  孤儿进程有什么危害?

孤儿进程是没有父进程的进程,孤儿进程这个重任就落到了init进程身上,init进程就好像是一个民政局,专门负责处理孤儿进程的善后工作。每当出现一个孤儿进程的时候,内核就把孤 儿进程的父进程设置为init,而init进程会循环地wait()它的已经退出的子进程。这样,当一个孤儿进程凄凉地结束了其生命周期的时候,init进程就会代表党和政府出面处理它的一切善后工作。因此孤儿进程并不会有什么危害。

  如何创建孤儿进程?

创建一个孤儿进程(只需要让父进程先退出,子进程继续执行)

#include<stdio.h> 
#include<unistd.h>
#include<stdlib.h>


int main()
{
//孤儿进程:父进程先退出,子进程继续执行
pid_t pid = fork();
if (pid == 0)
{
//子进程
while (1)
{
printf("child pid=%d ppid=%d\n", getpid(), getppid());
sleep(3);
}
}
else if (pid > 0)
{
//parent
printf("parent pid=%d ppid=%d\n", getpid(), getppid());
sleep(5);
exit(1);
}
else
{
perror("fork()");
}
return 0;
}

打开一个监控,由于这里还需要看到父进程的id

执行结果:(我们可以发现5秒之后子进程的父进程变为1号进程,说明当5秒之后父进程退出后,子进程被1号进程领养)