Linux进程概念(2)-进程的创建、僵尸进程和孤儿进程

进程的创建

说到进程的创建,那么不得不谈到一个重要的进程创建函数-fork()。
fork系统调用是复制一个进程。当一个进程调用完它之后,就会产生一个一模一样的进程,由此我们就得到了一个新进程,我们把新产生的这个进程叫做子进程,原来的进程叫做父进程。
fork这个单词是叉子的意思,可以看出它的命名和它的功能很相似。下面让我们通过一个小程序来了解fork的使用方法。
在这里插入图片描述编译,运行。
在这里插入图片描述
从中我们可以看出,调用了fork()之后,出现了两个进程,并且它们的进程标示符不同。其实,fork()之前只有一个进程,fork之后就产生了两个进程,并且fork返回两次,对于父进程,返回子进程的PID;对于子进程,返回0。
总结:
①fork是根据父进程创建的子进程,但是子进程信息和父进程的信息并不完全相同,父进程和子进程的进程标志符号(PID)不同,变量的PID也不同。
②fork被调用一次,却返回两次,并且它的返回值有三种不同的情况:
a.在父进程中,fork返回新创建子进程的进程ID;
b.在子进程中,fork返回0;
c.创建失败,fork返回一个负值。

僵尸进程

概念:僵尸状态是一个比较特殊的状态。当进程退出并且父进程没有读取到子进程推出的返回代码时就会产生僵尸进程。
僵尸进程会以终止状态保持在进程表中,并且会一直在等待父进程读取推出状态代码。所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入僵尸状态。
下面,我们来创建一个僵尸进程:

在这里插入图片描述
编译,运行。
在这里插入图片描述
运行结果:死循环。
在这里插入图片描述
查看进程状态信息,使用ps aux:

在这里插入图片描述发现出现僵尸进程,僵尸进程是用Z表示。

僵尸进程危害

通过上面创建的僵尸进程程序我们知道,如果父进程已知没有接收子进程的返回值,那么这个子进程就会变成僵尸进程,一直都不会退出。那么我们知道,进程状态信息属于进程基本信息,是保存在PCB中的,如果进程一直不退出,那么PCB就会一直维护,如果僵尸进程越来越多,那么PCB作为一个结构体变量,势必会占据越来越多的内存,导致内存的空间越来越少,造成内存泄漏。
我们可以通过杀死父进程,来结束子进程。当父进程被杀死之后,子进程会被1号进程“领养”,让后释放掉。但是这中做法损失太大,需要我们杀死父进程,所以不推荐。
如何更好地避免,我们后面说。

孤儿进程

孤儿进程,形如其名,就是没有父进程的进程。父进程先退出,子进程不退出,子进程就会变为孤儿进程。但是它会被1号进程领养,并且进行回收,所以不会有僵尸进程的危害。注:孤儿进程不是进程的状态。
下面我们通过一个小程序来了解孤儿进程:
在这里插入图片描述
编译,运行:
在这里插入图片描述
现象,死循环。
在这里插入图片描述

执行ps ll | grep a.out,发现孤儿进程,被1号进程领养。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值