1、僵尸进程

什么是僵尸进程?

处于僵死状态的进程—–(危害)会造成资源泄漏

僵尸进程的产生原因

子进程先于父进程退出,因为要保留退出原因,因此操作系统不能直接释放所有资源,通知父进程获取退出原因,允许操作系统释放资源,但是父进程没有关注这个通知导致子进程退出后无法释放所有资源,处于僵死状态成为僵尸进程。

解决方法

1.进程等待
2.结束父进程

模拟实现

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
#include<stdio.h>                                                                                         #include<stdlib.h>
#include<unistd.h>
int main()
{
printf("hello world %d\n",getpid());
pid_t pid = fork();
if(pid < 0)
{
printf("fork error ");
return -1;
}
else if (pid == 0)
{
printf("i am child %d\n",getpid());
exit(EXIT_SUCCESS);
}
else{
printf("i am parent %d\n",getpid());
}
printf("ni hao %d\n",getpid());
while(1)
{
printf("zhengzaiyunxing %d\n",getpid());
sleep(1);
}
return 0;
}

重新打开终端输入 ps -aux | grep z_process
在这里插入图片描述

孤儿进程

什么是孤儿进程

孤儿进程指的是在其父进程执行完成或被终止后仍继续运行的一类进程

孤儿进程产生的原因

父进程先于子进程退出,子进程就会成为孤儿进程,运行在后台,父进程成为1号进程。

模拟实现

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
#include<stdio.h>                                                                                         #include<stdlib.h>
#include<unistd.h>
int main()
{
printf("hello world %d\n",getpid());
pid_t pid = fork();
if(pid < 0)
{
printf("fork error ");
return -1;
}
else if (pid == 0)
{
printf("i am child %d\n",getpid());
}
else{
printf("i am parent %d\n",getpid());
}
printf("ni hao %d\n",getpid());
while(1)
{
printf("zhengzaiyunxing %d\n",getpid());
sleep(1);
}
return 0;
}

重新打开终端输入 ps -aux | grep z_process
在这里插入图片描述
使用 kill -9 8502 杀死父进程
使用 ps -ef | grep z_process 查看详细信息
在这里插入图片描述
子进程8503的父进程变为1了,成为了孤儿进程。

最后更新: 2019年06月17日 09:08

原始链接: http://CQolive.github.io/2019/06/17/僵尸进程与孤儿进程/

× 请我吃糖~
打赏二维码