简述Linux中的孤儿进程和僵尸进程

简述Linux中的孤儿进程和僵尸进程

孤儿进程


父进程先于子进程终止,则子进程变成孤儿进程(一个临时中间状态),系统很快将孤儿进程的父进程设置为 init

init进程

孤儿领养进程、孤儿收养院;
作用:
负责作为孤儿进程的父进程,在孤儿进程终止后,回收进程释放资源;

孤儿进程产生
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(){
	pid_t pid = fork();
	if(pid == -1){
		perror("create error");
	}
	if(!pid){
		sleep(100);
		exit(1);
	}
	sleep(30);
	printf("The parent process is terminated.\n");
	return 0;
}
查看
ps -ajx // 进程快照
| // 管道
grep ./orphan // 过滤器,匹配 ./orphan 
进程快照

至少有一个结果(ps进程),只有一个说明没有找到;
在这里插入图片描述
注:

  1. S 表示阻塞;

僵尸进程


子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程;
一个进程在调用exit命令结束自己的生命的时候,其实它并没有真正的被销毁, 而是留下一个称为僵尸进程(Zombie)的数据结构(系统调用exit,它的作用是 使进程退出,但也仅仅限于将一个正常的进程变成一个僵尸进程,并不能将其完全销毁);

思考

僵尸进程是不能使用 kill 命令清除掉的,因为 kill 命令只是用来终止进程的, 而僵尸进程已经终止。
思考!用什么办法可清除掉僵尸进程呢?
解答

  1. 改写父进程: wait/waitpid回收;
  2. 杀死父进程: kill其父进程(僵尸进程的父进程必然存在),僵尸进程成为"孤儿进程",被 init接管,init始终会负责清理僵尸进程,然后回收其占用的资源;
僵尸进程产生
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

int main(){
	pid_t pid = fork();
	if(pid == -1){
		perror("fork");
	}
	if(!pid){
		sleep(10);
		printf("The child process is exited.\n");
		exit(1);
	}
	sleep(30);
	return 0;
}
查看

Z 表示 zombie僵尸进程;

ps -ajx | grep process_name 
进程快照

在这里插入图片描述

注:

  1. Z 表示 zombie僵尸进程;
  2. [ ] 均表示进程已结束;

2020/07/25 11:45
@luxurylu

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值