孤儿进程
概念:
父进程先于子进程退出
子进程没有父进程获取自身的退出状态,也就变成了孤儿进程
但是,所有的孤儿进程都被一号(init)进程所收养,由一号进程作为所有孤儿进程的父进程,负责孤儿进程的资源释放
产生孤儿进程代码:
#include<stdio.h>
#include<unistd.h>
int main()
{
pid_t pid = fork();
if(pid < 0){
perror("fork");
}
else if(pid == 0){
printf("child pid = %d, ppid = %d\n", getpid(), getppid());
sleep(8);
printf("child pid = %d, ppid = %d\n", getpid(), getppid());
}
else{
sleep(3);
printf("father pid = %d, ppid = %d\n", getpid(), getppid());
}
return 0;
}
分析:首先让父进程睡眠3秒,那么子进程打印出第一句之后,进入8秒的休眠期,此时子进程的父进程id我们可以看到是父进程的id,三秒之后,父进程退出(孤儿进程形成条件) 8秒之后,子进程退出时,可以看到它的父进程id已经变成了 1, 也就是说明孤儿进程会被一号进程所领养!
注:孤儿进程在系统后台运行
僵尸进程
概念:
由于子进程先于父进程退出,
子进程退出时,为了保存自己的退出状态,等待父进程获取自己的退出状态,释放子进程资源
但是由于父进程并没有关心子进程退出,导致子进程一直占用着系统资源,不释放,直到父进程读取子进程退出状态
也就导致子进程变成了僵尸进程
产生僵尸进程代码:
#include<stdio.h>
#include<unistd.h>
int main()
{
pid_t pid = fork();
if(pid < 0){
perror("fork");
}
else if(pid == 0){
sleep(2);
printf("child pid = %d, ppid = %d\n", getpid(), getppid());
}
else{
sleep(5);
printf("father pid = %d, ppid = %d\n", getpid(), getppid());
}
return 0;
}
分析:
我们可以由代码和图片,可以知道,在前两秒时间里,子进程和父进程同时处于运行状态,当两秒之后子进程退出,此时父进程还未退出,未获取子进程的退出状态,形成了产生僵尸进程的条件,结果可以看到,在此状态下,子进程的状态变为Z,也就是僵尸状态,知道父进程也退出之后,其退出状态才被父进程获取,从而结束掉父子两个进程!
thanks!!!