【Linux操作系统】孤儿进程


什么是孤儿进程?

在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号进程领养的就被称为孤儿进程

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_麦子熟了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值