简述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进程),只有一个说明没有找到;
注:
- S 表示阻塞;
僵尸进程
子进程比父进程先结束,而父进程又没有回收子进程,释放子进程占用的资源,此时子进程将成为一个僵尸进程;
一个进程在调用exit命令结束自己的生命的时候,其实它并没有真正的被销毁, 而是留下一个称为僵尸进程(Zombie)的数据结构(系统调用exit,它的作用是 使进程退出,但也仅仅限于将一个正常的进程变成一个僵尸进程,并不能将其完全销毁);
思考
僵尸进程是不能使用 kill 命令清除掉的,因为 kill 命令只是用来终止进程的, 而僵尸进程已经终止。
思考!用什么办法可清除掉僵尸进程呢?
解答
- 改写父进程: wait/waitpid回收;
- 杀死父进程: 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
进程快照
注:
- Z 表示 zombie僵尸进程;
- [ ] 均表示进程已结束;
2020/07/25 11:45
@luxurylu