什么是孤儿进程?
在Linux中:
1.若子进程先退出,而父进程没有对子进程的退出结果进行读取,那么我们称该子进程为僵尸进程。
有关僵尸进程的讲解,请移步至这篇文章->进程-僵尸进程
2.若父进程先退出,子进程后退出,那么子进程变成僵尸状态之后就没有父进程对其进行处理,此时该子进程就称之为孤儿进程,那么孤儿进程该如何处理呢?
答案是:若一直不处理这个子进程,那么子进程就会一直占用资源,造成内存泄漏,因此,如果出现孤儿进程,孤儿进程将会被1号init进程领养,此后孤儿进程进入僵尸状态就由1号init进程处理回收。
看着这冗长的文字,相信有些小伙伴还是一点懵逼,接下来,我通过代码演示给大家看。
示例
测试代码:以下代码,fork函数创建的子进程会一直打印信息,父进程在打印5次信息后会退出,此时该子进程就变成了孤儿进程。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main()
{
pid_t id = fork();
if(id == 0){ //child
while(1){
printf("我是子进程...PID:%d, PPID:%d\n", getpid(), getppid(), count);
sleep(1);
}
}
else if(id > 0){ //father
int count = 5;
while(count){
printf("我是父进程...PID:%d, PPID:%d, count:%d\n", getpid(), getppid(), count);
sleep(1);
count--;
}
printf("father quit...\n");
exit(0);
}
else{ //fork error
}
return 0;
}
运行结果:
运行程序,同时监控进程资源。fork之后,一开始子进程和父进程一起运行,从图上可以看出,此时子进程的PPID==父进程PID,并且进程是S+状态(前台进程,可以ctrl+c终止);
父进程结束后,立马被base回收。子进程被1号init进程(操作系统)领养,此时,从上图可以发现,父进程结束了,子进程的PPID变成了1,同时,切换到后台运行(S状态),这种情况下使用ctrl+c是终止不了子进程的,需要使用kill -9 PID命令,或者Killall+进程名才能杀掉子进程(后台进程),那么~这种被1号进程领养的就被称为孤儿进程。