僵尸进程
产生原因
子进程先于父进程退出,他要保留退出原因在pcb中,因此退出后不会自动释放所有资源,子进程退出后操作系统会通知父进程,子进程退出了,去获取一下原因,然后完全释放子进程资源,假如父进程不管子进程的退出状态,那么这个子进程将进入僵死状态,成为僵尸进程
代码实现僵尸进程
//该程序为20秒的僵尸进程,在第10秒时变为僵尸进程,30秒时退出
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
int main()
{
pid_t pid = fork();//创建子进程
if (pid < 0)//fork返回值小于零时是创建出错
{
perror("fork error");
return -1;
}
else if(pid == 0)//fork返回值为零时,是在子进程中
{
printf("this is child!!\n");
sleep(10);
exit(EXIT_SUCCESS);
}
else//在父进程中,fork的返回值是创建出的子进程的pid
{
printf("this is parent!!\n");
sleep(20);
}
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
此图是在程序运行10秒内的进程信息,可以看出父子进程此时都是S状态,也就是睡眠态
此图是程序运行10秒后到20秒内的进程信息,此时的父进程还是睡眠状态,而子进程已经变为僵尸态,此时的父进程就是僵尸进程
孤儿进程
产生原因
父进程先于子进程退出
此时父进程变为init进程,也就是说,父进程退出了,init进程将负责释放资源,init进程非常负责任,因此,孤儿进程不会成为僵尸进程
代码实现
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
int main()
{
pid_t pid = fork();
if (pid < 0)
{
perror("fork error");
return -1;
}
else if (pid > 0)
{
printf("parent %d\n", getpid());
return 0;
}
else
{
sleep(30);
}
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
此图为10秒前,此时未成为孤儿进程,父进程pid为4764,子进程pid为4765
从上图中可以看出父进程已经退出了,pid为4765的进程其父进程的pid为1,也就是其父进程变为init进程,此时已经成为孤儿进程,最终init进程在子进程结束后将负责释放其资源
---------------------
作者:K_A_Irving
来源:CSDN
原文:https://blog.csdn.net/K_A_Irving/article/details/83792697
版权声明:本文为博主原创文章,转载请附上博文链接!