【Linux】僵尸与孤儿 进程等待

目录

一,僵尸进程

1,僵尸进程

2,僵尸进程的危害

二,孤儿进程

1,孤儿进程

三,进程等待

1,进程等待的必要性

2,wait 方法

3,waitpid 方法

4,回收小结


一,僵尸进程

1,僵尸进程

僵死状态(Zombies)是一个比较特殊的状态。

当进程退出并且父进程(使用wait()系统调用,后面讲) 没有读取到子进程退出的返回代码时就会产生僵死(尸)进程 僵死进程会以终止状态保持在进程表中,并且会一直在等待父进程读取退出状态代码。

所以,只要子进程退出,父进程还在运行,但父进程没有读取子进程状态,子进程进入Z状态

来一个创建维持30秒的僵死进程例子:

#include <stdio.h>
#include <stdlib.h>
int main()
{pid_t id = fork();if (id < 0) {perror("fork");return 1;}else if (id > 0) { //parentprintf("parent[%d] is sleeping...\n", getpid());sleep(30);}else {printf("child[%d] is begin Z...\n", getpid());sleep(5);exit(EXIT_SUCCESS);}return 0;
}

当fork()函数返回值,父进程和子进程同时启动,当子进程运行结束退出进程时,父进程还在等待,此时子进程一直在等待父进程读取其退出状态代码,于是产生了僵尸状态;

僵尸状体会造成内存泄漏,我们要尽可能避免;

2,僵尸进程的危害

进程的退出状态必须被维持下去,因为他要告诉关心它的进程(父进程),你交给我的任务,我办的怎么样了。可父进程如果一直不读取,那子进程就一直处于Z状态?是的!

维护退出状态本身就是要用数据维护,也属于进程基本信息,所以保存在task_struct(PCB)中,换句话说,Z状态一直不退出,PCB一直都要维护?是的!

那一个父进程创建了很多子进程,就是不回收,是不是就会造成内存资源的浪费?是的!因为数据结构对象本身就要占用内存,想想C中定义一个结构体变量(对象),是要在内存的某个位置进行开辟空间!

内存泄漏?是的!

二,孤儿进程

1,孤儿进程

父进程如果提前退出,那么子进程后退出,进入Z之后,那该如何处理呢?

父进程先退出,子进程就称之为“孤儿进程”

孤儿进程被1号init进程领养,当然要有init进程回收喽。

我们写一个进程来感受一下:

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
int main()
{pid_t id = fork();if (id < 0) {perror("fork");return 1;}else if (id == 0) {//childprintf("I am child, pid : %d\n", getpid());sleep(10);}else {//parentprintf("I am parent, pid: %d\n", getpid());sleep(3);exit(0);}return 0;
}

fork()函数返回后,子进程和父进程同时运行,当父进程执行结束并且退出后,子进程还在运行,此时子进程沦为孤儿!

一般孤儿进程最后会被1号init进程领养,不会造成内存泄漏;

三,进程等待

1,进程等待的必要性

之前讲过,子进程退出,父进程如果不管不顾,就可能造成‘僵尸进程’的问题,进而造成内存泄漏。

另外,进程一旦变成僵尸状态,那就刀枪不入,“杀人不眨眼”的kill -9 也无能为力,因为谁也没有办法杀死一个已经死去的进程。

最后,父进程派给子进程的任务完成的如何,我们需要知道。如子进程运行完成,结果对还是不对, 或者是否正常退出。

父进程通过进程等待的方式,回收子进程资源,获取子进程退出信息

2,wait 方法

pid_t wait(int*status);

返回值: 成功返回被等待进程pid,失败返回-1。

参数: 输出型参数,获取子进程退出状态,不关心则可以设置成为NULL

#include <stdio. h>
#include <unistd.h>
#include <stdlib.h>
#include<sys/types.h>
#include<sys / wait.h>
int main()
{pid_t id = fork();if (id < 0) {perror("fork");return 1;}else if (id == 0) {//parentprintf("child[%d] is sleeping...\n", getpid());sleep(5);exit(3);}int status = 0;pid_t rid = wait(&status);if (rid > 0){printf("parent[%d] is begin Z...\n", rid);sleep(10);}else {printf("进程失败:rid:%d\n", rid);}return 0;}

这样子 wait 会自动及时回收子进程,不会形成僵尸,不会造成内存泄漏;

3,waitpid 方法

pid_ t waitpid(pid_t pid, int *status, int options);

返回值: 当正常返回的时候waitpid返回收集到的子进程的进程ID;

如果设置了选项WNOHANG,而调用中waitpid发现没有已退出的子进程可收集,则返回0;

如果调用中出错,则返回-1,这时errno会被设置成相应的值以指示错误所在;

参数:

pid: Pid=-1,等待任一个子进程。与wait等效。 Pid>0.等待其进程ID与pid相等的子进程。 status: WIFEXITED(status):

若为正常终止子进程返回的状态,则为真。

(查看进程是否是正常退出) WEXITSTATUS(status): 若WIFEXITED非零,提取子进程退出码。(查看进程的退出码) options: WNOHANG:

若pid指定的子进程没有结束,则waitpid()函数返回0,不予以等待。若正常结束,则返回该子进 程的ID。

#include <stdio. h>
#include <unistd.h>
#include <stdlib.h>
#include<sys/types.h>
#include<sys / wait.h>
int main()
{pid_t id = fork();if (id < 0) {perror("fork");return 1;}else if (id == 0) {//parentprintf("child[%d] is sleeping...\n", getpid());sleep(5);exit(3);}int status = 0;pid_ t rid = waitpid(-1,&status,0);if (rid > 0){printf("parent[%d] is begin Z...\n", rid);sleep(10);}else {printf("进程失败:rid:%d\n", rid);}return 0;}

4,回收小结

如果子进程已经退出,调用wait/waitpid时,wait/waitpid 会立即返回,并且释放资源,获得子进程退出信息。

如果在任意时刻调用 wait/waitpid,子进程存在且正常运行,则进程可能阻塞。

如果不存在该子进程,则立即出错返回。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/566414.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux bool变量,Objective-C中的占位符,打印BOOL类型数据

常用的一些占位符&#xff1a;%&#xff1a;字符串占位符%d:整型%ld:长整型%f:浮点型%c:char类型%%&#xff1a;%的占位符尽管有那么多的占位符&#xff0c;但是好像没有发现BOOL型的数据的占位符&#xff0c;这也是比较纠结的地方&#xff0c;看了一下别人是怎么解决这个问题的…

c语言gets n,c语言中gets ,getschar 和fgets 的用法及三者之间的差别

满意答案wkmpbg846推荐于 2018.02.27采纳率&#xff1a;45% 等级&#xff1a;8已帮助&#xff1a;362人gets():原型:char *gets(char *buffer) ;功能:从stdlin中获取获取字符串一直到换行符或者遇到EOF为止&#xff0c;但换行符不被录取&#xff0c;会将换行符替换成‘\0’来…

android中svn插件安装,AndroidSDK安装SVN插件问题解决

工具版本信息:Eclipse4.2ADT23.0Subclipse1.10,插件安装地址:http://subclipse.tigris.org/update_1.10.x问题一报错信息如下:Cannot complete the install because one or more required items could not be found.Software being installed: Subversion Revision Graph 1.1.1…

鸿蒙系统的变化,鸿蒙系统没变化的背后

原标题&#xff1a;鸿蒙系统没变化的背后鸿蒙系统发布以后被很多人吐槽&#xff0c;说是没什么变化&#xff0c;和之前体验的安卓系统简直一模一样&#xff0c;真的失望至极。其实&#xff0c;鸿蒙系统还是从底层做出了改变&#xff0c;只不过没有变了界面和运行方式而已。那么…

三星s2 硬刷Android 8,三星T710(GALAXY Tab S2 8.0)一键救砖教程,轻松刷回官方系统...

三星T710(GALAXY Tab S2 8.0)手机变砖了怎么办?对于经常刷机的安卓玩家来说&#xff0c;碰到刷机失败导致三星T710(GALAXY Tab S2 8.0)手机无法启动甚至无法进入recovery都是在所难免的事&#xff0c;这个时候我们就需要用到奇兔线刷大师线刷救砖功能了&#xff0c;它能轻松实…

鸿蒙工业互联网,工业互联网 3D 展示平台

原标题&#xff1a;工业互联网 3D 展示平台项目简介产业园区占地约为 158.46 亩&#xff0c;现有生产车间两栋、研发楼一栋、检测楼一栋、食堂及倒班楼一栋、废品库一栋、门卫室两处、综合站房一处。主要从事电缆、电线的生产与加工。产业园区综合管理平台项目开发内容复杂&…

lean软件Android有吗,leanchat-android

LeanChat Android 客户端简介LeanChat 是 LeanCloud 实时通信 组件的 Demo&#xff0c;通过该应用你可以学习和了解 LeanCloud 实时通信功能。效果截图Leanchat 项目构成如果你从 github clone 速度很慢&#xff0c;可以从 这里 下载项目源码压缩包。部署创建应用注册并登录 Le…

华为系统10.0是鸿蒙吗,暂时忘记鸿蒙!华为EMUI 10.0发布时间确认:这才是主角...

原标题&#xff1a;暂时忘记鸿蒙&#xff01;华为EMUI 10.0发布时间确认&#xff1a;这才是主角华为鸿蒙系统由于顶着“自研”的光环&#xff0c;自曝光以来便受到科技圈的追捧&#xff0c;虽并未推出但已经有“众星捧月”的迹象。媒体追逐鸿蒙系统自然是为了热度和流量&#x…

a4纸在html的像素,打印常识:A4纸张在显示器上应该要多少像素?

A4纸的尺寸是210mm*297mm&#xff0c;也就是21.0cm*29.7cm&#xff0c;而1英寸2.54cm&#xff0c;如果屏幕DPI分辨率为72像素/英寸&#xff0c;换算一下&#xff1a;相当于1cm可呈现 (72px/2.54cm) 28.34px下面是一些常用分辨率下A4纸在屏幕上的像素尺寸&#xff1a;分辨率是7…

wether.html5.qq.com,人教版英语九年级全一册Unit 1单元测试卷及参考答案解析(含听力...

UNIT 1 达标测试卷时间&#xff1a;120分钟 满分&#xff1a;150分第一卷 听力部分(30分)一、关键词语选择(共5小题&#xff1b;每小题1分&#xff0c;满分5分)1. A. note B.nose C. notice2. A. repair B. report C.repeat3. A. widely B. quickly C.wisely4.A. screen B.s…

世界上覆盖范围最广的计算机网络是 ( ),世界上覆盖范围最广的计算机网络是()。...

摘要&#xff1a;部会天翼自动格将俱乐取消员资客户&#xff0c;世界上覆下列情况哪些出现时。围最包单包工总承责任单位对分安全程的承担位和分包生产。计算机网包分政基作业工分建筑础设程施为(劳务和市)和房屋分包施工。...部会天翼自动格将俱乐取消员资客户&#xff0c;世界…

CAM是利用计算机,利用DroidCam将手机摄像头打造成计算机摄像头

利用DroidCam将手机摄像头打造成电脑摄像头1.目的现在许多同学的电脑上没有摄像头&#xff0c;但是随着智能手机的普及&#xff0c;大多数同学都有带摄像头的手机。而智能手机的摄像头比电脑的usb摄像头的效果好很多。那可不可以把手机摄像头用在电脑上来网络聊天呢&#xff0c…

电大计算机应用技术基础视频,电大形成性测评-计算机应用技术基础01

电大形成性测评-计算机应用技术基础01 (7页)本资源提供全文预览&#xff0c;点击全文预览即可全文预览,如果喜欢文档就下载吧&#xff0c;查找使用更方便哦&#xff01;15.9 积分&#xfeff;01任务-在线作业试卷总分&#xff1a;100 测试时间&#xff1a;-- 单项选择题 …

北大计算机博进高校,他是北大第一位博士,留校任教却连做三件“傻事”,博导都没评上...

自北大1898年创办至今&#xff0c;早已度过了风雨百年&#xff0c;一路发展、创造辉煌&#xff0c;令人慨叹不已。身为我国名校的门面招牌之一&#xff0c;北大底蕴深厚、实力强劲&#xff0c;校园环境优美、师资力量雄厚&#xff0c;不知是多少学子可望而不可及的理想学府。在…

计算机打印过的文件在哪找到,请问如何在电脑里查找已经打印过的文件

满意答案苏mmkk2013.07.06采纳率&#xff1a;45% 等级&#xff1a;11已帮助&#xff1a;20600人如果你的系统是XP 的话查找电脑名称&#xff1a;在桌面“我的电脑”上点右键。第二个选项卡上有“计算机名”上面显示的有完整的计算机名&#xff0c;如果想更改的话&#xff0c…

tomcat服务器运行环境,win7怎么配置Tomcat服务器环境|win7系统配置Tomcat服务器环境的方法...

‍‍许多用户询问说win7旗舰版系统怎么配置Tomcat服务器环境&#xff1f;tomcat是什么&#xff1f;它一款轻量级免费开源的Web服务器,我们再使用tomcat时,最好配置一下环境变量。很多新手用户不知道怎么配置Tomcat服务器环境&#xff0c;安装配置Tomcat的方法和java有些相同&am…

心脏遥测监控系统服务器,基于ARM7的心电采集与远程传输系统设计

该系统设计的监护模块与医院内心电监护中心的心电实时监控服务器都工作于客户/服务器模式下。在工作状态下&#xff0c;心电数据接收转发器客户端应用程序&#xff0c;首先初始化以太网接口&#xff0c;然后主动与医院内心电实时监控服务器建立连接&#xff1b;连接成功后&…

linux装服务器系统,linux服务器系统安装

linux服务器系统安装 内容精选换一换安装完操作系统后的临时云服务器需要进行相关配置&#xff0c;并安装原生的XEN和KVM驱动&#xff0c;才能保证后续创建的云服务器正常使用。该任务指导用户完成Linux云服务器的相关配置与驱动安装&#xff0c;从而创建为Linux系统盘镜像。配…

服务器bios修改uefi,服务器 uefi bios设置

服务器 uefi bios设置 内容精选换一换对于不同的硬件设备&#xff0c;通过在BIOS中设置一些高级选项&#xff0c;可以有效提升服务器性能。服务器上的SMMU一般用来完成设备的地址转换&#xff0c;并且可以实现设备隔离&#xff0c;在虚拟化中很实用&#xff0c;但是在物理机测试…

越狱装源未能连接到服务器,科普cydia无法加载源地址插件安装错误解决方法及Cydia怎么备份shsh...

苹果越狱是不少iPhone用户的乐趣&#xff0c;而cydia也是苹果越狱的标志&#xff0c;不过有不少小伙伴却发现自己的&#xff0c;而且也会提示插件安装错误等&#xff0c;那么要怎么解决这个问题呢&#xff0c;不妨随小编一起来研究一下吧。关于cydia无法正常加载插件列表?加载…