Linux下进程子进程的退出情况

  进程的退出分为了两大类,一类是正常的退出,另一类是非正常的退出。

正常退出时有五种情况,分别是

①main函数调用return

②进程调用exit(),标准c库

③进程调用_exit()或者_Exit(),属于系统调用

④进程最后一个线程返回

⑤最后一个线程调用pthread_exit

非正常退出时有3种情况,分别是

①使用abort终止

②进程收到某些信号的时候,如使用ctrl+c终止

③最后一个线程对取消(cancellation)请求做出响应

这里我们主要来用exit函数来讲解子进程正常退出

一、验证子进程正常退出,父进程有无调用wait函数的区别

1.父进程无调用wait函数,程序如下

运行结果如下,我们可以看到子进程的ID号是2298,父进程的ID是2297。我们使用

ps -aux|grep a.out命令后可以发现父进程正在运行,状态是S+;子进程的状态是S+,代表僵尸进程。所谓僵尸进程就是说“死而不僵”,看似结束了,但是还存在,就是不工作。同时大家应该还可以看到2394的存在,这是因为使用了ps -aux|grep a.out命令产生了新的进程

2. 父进程调用wait函数,程序如下

运行结果如下,可以看到子进程运行结束后已经彻底消失,不存在僵尸进程。

二、验证子进程正常退出,wait函数功能的验证

wait函数具有阻塞功能,可以然子进程先运行完,父进程才可以运行。wait函数还可以存放子进程退出状态(就是子进程在调用exit函数时,exit的参数)。我们知道,fork函数创建的进程子进程和父进程的运行时没有规律的,两个进程是“抢着”运行,父进程是不会等待子进程的。下面我们就利用fork函数验证的wait函数的阻塞功能。代码如下

运行结果如下,我们可以看到父进程是等到子进程结束之后才开始运行的。子进程在结束的时候exit函数的参数是3,wait函数的参数status原来是10,现在变成了3。说明wait函数具有阻塞功能,还可以存放子进程退出状态。

这里有一个小细节,打印ststus的值的时候,你不能直接写ststus=%d\n"status,而是写成

ststus=%d\n",WEXITSTATUS(status)的样子,没办法,书本规定的。

三、子进程变成孤儿进程

   如果创建了子进程,并且父进程运行完了之后,就直接结束了,这时候子进程就会变成了孤儿进程。就好比一个孩子刚出世,父亲没了一个道理。但是linux中为了防止孤儿进程较多,init进程会收留孤儿进程,变成这些孤儿进程的父进程。这就好比刚出生的孩子没了亲生父亲,但是却有个后爹。

下面我们用代码验证一下

运行结果如下,这里还有个小问题,就是有可能你运行出来的“养父”pid的结果不是1。这是因为我们目前使用的是在图形界面打开的terminal是伪终端,需要切换界面,切换到字符型界面,命令如下:

图形界面切换到字符型界面:
Crtl+Alt+F3/Ctrl+Fn+Alt+F3
字符型界面切换到图形界面:
Ctrl+Alt+F2/Ctrl+Fn+Alt+F2

再运行程序,父进程pid变为1.成功。(细节可参考这位大佬的博客,http://t.csdnimg.cn/KsvG7)

下图就是切换到字符型界面的结果

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

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

相关文章

linux单机部署mysql(离线环境解压即可)

一、下载官网压缩包(tar.gz) MySQL :: Download MySQL Community Serverhttps://dev.mysql.com/downloads/mysql/根据自己的操作系统发行版本、位数、gclib版本、mysql版本来选择对应的压缩包 比如我是 linux系统debian10(官网只有linux ge…

vue:菜单栏联动内容页面tab

一、需求 需要实现效果:左侧菜单栏与右侧内容部分联动,当点击左侧的菜单,右侧会展示对应的tab,没有点击时,不展示(如刚进入页面没有点击菜单,则没有tab);点击后没有关闭…

玖章算术NineData通过阿里云PolarDB产品生态集成认证

近日,玖章算术旗下NineData 云原生智能数据管理平台 (V1.0)正式通过了阿里云PolarDB PostgreSQL版 (V11)产品集成认证测试,并获得阿里云颁发的产品生态集成认证。 测试结果表明,玖章算术旗下NineData数据管理平台 (V1.0&#xff…

Maxwell介绍

一、介绍 介绍:它读取MySQL binlog并将数据更改作为JSON写入Kafka、Kinesis和其他流媒体平台(目前支持:kafka、RabbitMQ、Redis、file、Kinesis、Nats、Google Cloud Pub/Sub、Google Cloud Bigquery、SNS) 版本:从v1.…

【车载开发系列】Autosar DCM诊断管理模块

【车载开发系列】Autosar DCM诊断管理模块 【车载开发系列】Autosar DCM诊断管理模块 【车载开发系列】Autosar DCM诊断管理模块一. DCM模块概念二. DCM模块与Autosar其他模块关系1)Dcm和PduR的交互2)Dcm和ComM模块的交互3)Dcm和Dem的交互4&a…

RocketMQ常见面试题及答案梳理

1、RocketMQ有什么作用? 异步:数据的产生方不需要关心谁来使用数据,只需要将数据发送到broker,后续需要管消费流程,Rocket也有保证消息可靠性的方案消峰:正常业务系统当流量激增时,有可能会将系统压垮,有了…

ChatGPT正确打开方式与GPT-4.5的key最新获取方式

前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家:https://www.captainbed.cn/z ChatGPT体验地址 文章目录 前言4.5key价格泄漏ChatGPT4.0使用地址ChatGPT正确打开方式最新功能语音助手存档…

【2015~2024】大牛直播SDK演化史

大牛直播SDK的由来 大牛直播SDK始于2015年,最初我们只是想做个低延迟的RTMP推拉流解决方案,用于移动单兵等毫秒级延迟的场景下,我们先是实现了Android平台RTMP直播推送模块,当我们用市面上可以找到的RTMP播放器测试时延的时候&am…

网络设备的分类和功能、机柜布局、网络设备安装

网络互连设备根据不同层实现的机理不一样,又具体分为五类: 1、网络传输介质互联设备 2、网络物理层互联设备 3、数据链路层互联设备 4、网络层互联设备 5、应用层互联设备 常用设备 网络互联设备--互联设备 1、中继器 中继器是局域网互连的最简单…

恒创科技:云存储和网盘怎么区分出来?

随着互联网的发展,数据存储已成为人们日常生活中不可或缺的一部分。云存储和网盘是经常被人们提及的两种存储方式,均通过网络进行数据存储和访问的服务。但,它们在技术实现、数据安全性、访问方式和数据容量等方面存在一定的差异。要区分&…

三甲医院预约挂号系统源码,具备后台管理端和用户使用端,用户使用端包括:微信公众号、支付宝小程序

随着医疗行业的不断发展,预约挂号管理系统已成为医院管理中不可或缺的一部分。 预约挂号管理系统是一款综合性的预约挂号管理系统,帮助医院实现全方位的信息化管理,提高医疗服务质量和效率。支撑公众号、小程序、手机网上预约。 一款服务适用…

企业用户注册阿里云账号:为何选择企业实名认证及其五大优势

在数字化时代,云计算已成为企业运营不可或缺的一部分。阿里云,作为领先的云服务提供商,为企业用户提供了丰富的云产品和解决方案。但在享受这些服务之前,企业用户需要完成阿里云账号的注册和实名认证。本文将深入探讨为何企业用户…

小程序打包发行流程

工具 HBuilder X 、微信开发者工具、微信公众平台地址(微信公众平台) 配置 一、manifest.json 配置 通过 HBuilder X 打开 manifest.json 文件,找到 微信小程序配置,填写 微信小程序AppID,此 AppID 必须是本人有权…

Jvm相关知识(面试高级必备)

类的实例化顺序 先静态、先父后子 先静态:父静态>子静态 优先级:父类>子类 静态代码块>非静态代码块>构造函数 一个类的实例化过程: ①.父类的static代码块,当前类的static; ②.顺序执行…

freeswitch on centos dockerfile模式

概述 freeswitch是一款简单好用的VOIP开源软交换平台。 centos7 docker上编译安装fs的流程记录,本文使用dockerfile模式。 环境 docker engine:Version 24.0.6 centos docker:7 freeswitch:v1.6.20 dockerfile 创建空目录…

力扣电话号码的组合

文章目录 题目说明做题思路代码实现代码解析 题目链接 题目说明 首先我们先分析一下这个题目题目中说呢先给出一个字符串这个字符串其实就是这个九键数字我们要按照要求将数字所代表的字符进行自由组合形成一个字符串并且这个字符串的长度和输入的数字字符串长度相同&#xff0…

第11章 GUI Page500~504 步骤三十二:打开画板文件02

各个图元类新增GetTypeName_Static(),并将原来的GetTypeName()改为调用静态方法实现: 直线: 圆: 十字: 矩形: 文字: tool_4_save_load.hpp添加两行 tool_4_save_load.cpp增加: 增加…

【资治通鉴】古代纪年法 ( 天干地支纪年法 | 木星纪年法 | 太岁纪年法 | 星次 | 天球 | 黄道带 | 四象二十八星宿 )

文章目录 一、天干地支纪年法二、木星纪年法1、星次2、天球3、黄道带 三、太岁纪年法四、四象二十八星宿1、四象与二十八星宿关联2、二十八星宿与星次关联3、西游记中的二十八星宿 2024 年 使用 天干地支纪年法是 甲辰年 , 使用 太岁纪年法是 阏逢执徐 ; 一、天干地支纪年法 天…

建筑能源管理系统

建筑能源管理系统是一种集成了先进的监测、控制、分析和优化技术的智能化系统,旨在提高建筑能源效率,降低能源消耗,减少环境污染,并为用户提供舒适、安全的建筑环境。通过监测建筑内的各种能源消耗情况,如电力、热水、…

arthas(阿尔萨斯)日常java代码调优使用命令

官方项目文档:https://gitee.com/arthas/arthas (最权威的教学还是得官网,这里仅作简单记录) 1:启动 java -jar arthas-boot.jar 2:查看cpu占用排名前三 thread -3 3:查看指定id thread 203 4:查…