系统相关
首页 > 系统相关> > 僵尸进程---孤儿进程

僵尸进程---孤儿进程

作者:互联网

文章目录

进程

基本概念

进程:可执行程序 +管理该进程的数据结构集合
进程控制块(PCB):进程属性的集合

进程创建(fork)
在这里插入图片描述

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main()
{
int ret = fork();
printf("hello proc : %d!, ret: %d\n", getpid(), ret);
sleep(1);
return 0;
}

由于PCB里的程序计数器存储的是即将被执行的下一条指令的地址,故在执行完fork()语句之后,子进程从父进程拷贝过来的代码直接从fork语句的下一条语句执行

相关命令

僵尸进程

概念:

所谓僵尸进程,是指子进程先于父进程退出,子进程会告知父进程自己退出的消息,但是父进程不予理会,导致该子进程变成了僵尸进程

测试案例与结果:
在这里插入图片描述

S+表示睡眠状态
R+表示运行状态
Z+表示僵死状态

僵尸进程危害

占用了操作系统的资源,内存泄露掉了

解决僵尸进程方法

孤儿进程

概念:

所谓孤儿进程是指父进程先于子进程退出,子进程被init进程所领养,该子进程便变成了孤儿进程。(进程是没有孤儿状态的

测试案例与结果

在这里插入图片描述

可以看出父进程先于子进程结束后,子进程被一号进程(init进程)所领养,故由一号进程回收喽。

问题引入:

#include <stdio.h>
  2 #include <unistd.h>
  3 int main()
  4 {
  5     int i=10;
  6     int ret=fork();
  7     if(ret<0)
  8     {
  9         return 0;
 10     }
 11     else if(ret==0)
 12     {
 13         printf("child.  i=%d,%p\n", i, &i);
 14     }
 15     else
 16     {
 17         i += 10;
 18         printf("father.  i=%d,%p\n", i, &i);
 19     }
 20     return 0;
 21 }

在这里插入图片描述
(为什么父进程的 i 和子进程的 i 地址一样,值却不一样呢?

这就是写时拷贝的原理:
https://blog.csdn.net/qq_44768163/article/details/115054802

在这里插入图片描述

标签:fork,僵尸,int,ret,---,孤儿,进程,include
来源: https://blog.csdn.net/qq_44768163/article/details/115014661