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

news2024/11/25 23:22:53

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

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

①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.coloradmin.cn/o/1393567.html

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

相关文章

密码产品推介 | 沃通安全电子签章系统(ES-1)

产品介绍 沃通安全电子签章系统(ES-1)是一款基于密码技术、完全自主研发的商用密码产品,严格遵循国家密码管理局制定的相关标准,可为企业和个人提供安全、合规的电子签章功能服务。产品的主要用途是为各类文书、合同、表单等电子…

Java-NIO 开篇(1)

NIO简介 高性能的Java通信,离不开Java NIO组件,现在主流的技术框架或中间件服务器,都使用了Java NIO组件,譬如Tomcat、 Jetty、 Netty、Redis、RabbitMQ等的网络通信模块。在1.4版本之前, Java IO类库是阻塞式IO&…

如何将信用卡或借记卡关联到您的PayPal账户

第1步:在PayPal控制面板中关联 您在登录到PayPal账户之后,前往顶部菜单条中的 “钱包”,然后点击“关联卡”。 第2步:输入您的信用卡或借记卡详情 第3步:添加新的借记卡或信用卡 使用PayPal绑定信用卡吧,…

Node.js基础---fs文件系统 读取和写入

什么是nodejs? 脚本语言需要一个解析器才能运行,JavaScript是脚本语言,在不同的位置有不一样的解析器,如写入html的js语言,浏览器是它的解析器角色。而对于需要独立运行的JS,nodejs就是一个解析器。 每一种解析器都是…

vue3项目eslint配置、配置prettier(格式化配置)

文章链接: 全部配置链接 第一步:eslint配置、配置prettier(代码格式化):点击链接 (1) .eslint.cjs—eslint配置文件 (2).eslintignore—校验忽略文件 (3).prettierrc.json添加规则 (4).prettierignore忽略文件 prettierrc规范说明: 第二步:styleLint配置 样式链接 第三…

迭代器模式介绍

目录 一、迭代器模式介绍 1.1 迭代器模式定义 1.2 迭代器模式原理 1.2.1 迭代器模式类图 1.2.2 模式角色说明 1.2.3 示例代码 二、迭代模式的应用 2.1 需求说明 2.2 需求实现 2.2.1 抽象迭代类 2.2.2 抽象集合类 2.2.3 主题类 2.2.4 具体迭代类 2.2.5 具体集合类 …

云边协同的 RTC 如何助力即构全球实时互动业务实践

作者:即构科技 由 51 CTO 主办的“WOT 全球技术创新大会 2023深圳站”于 11 月 24 日 - 25 日召开,即构科技后台技术总监肖潇以“边缘容器在全球音视频场景的探索与实践”为主题进行分享。 边缘计算作为中心云计算的补充,通过边缘容器架构和…

scalpel一款命令行漏洞扫描工具,支持深度参数注入,拥有一个强大的数据解析和变异算法

免责声明 由于传播、利用本文章所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章及作者不为此承担任何责任,一旦造成后果请自行承担!如有侵权烦请告知,我们会立即删除并致歉。谢谢&#xf…

javaweb学习day01(HTML)

一、B/S 软件开发架构简述 1 Java Web 技术体系图 2 B/S 软件开发架构简述 B/S架构 前端 后端 数据库 二、HTML 1 官方文档 地址: https://www.w3school.com.cn/html/index.asp 离线文档: W3School 离线手册(2017.03.11 版).chm 2 网页 3 HTML 介绍 3.1 HTML 是什么…

vue基于Spring Boot的中医在线学习课程购买服务管理系统

SpinrgBoot的主要优点有: 1、为所有spring开发提供了一个更快、更广泛的入门体验; 2、零配置; 3、集成了大量常用的第三方库的配置; 4、提供准备好的特性。当今,nodejs领域的开发者机会都在使用SpinrgBoot,在开发领域逐…

SQL Server Management Studio基础

文章目录 一、SQL Server Management Studio介绍二、创建数据库 一、SQL Server Management Studio介绍 SQL Server Management Studio(SSMS)是用于管理和操作Microsoft SQL Server数据库的集成环境。用力啊方便管理员和开发人员进行数据库管理、查询、…

云轴科技ZStack 助力广西某地级市建设市级警务云视频系统

某市属于广西壮族自治区辖地级市,省域副中心城市,选择云轴科技ZStack 超融合解决方案支撑警务云视频监控联网管理系统(警务云视频系统),实现了该市对各辖区视频资源统一管理;同时也满足了该市警务云视频系统…

【5G Modem】5G modem架构介绍

博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持! 博主链接 本人就职于国际知名终端厂商,负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G算力网络技术标准研究。 博客…

微信小程序的基础开发

微信小程序目录结构 一个小程序主体部分由三个文件组件,必须放在项目的根目录, 一个小程序page页面由四个文件组件,分别为: ,js文件:用来写JavaScript wxml文件:写页面结构,可以理解为html json: 里面是页…

VsCode + CMake构建项目 C/C++连接Mysql数据库 | 数据库增删改查C++封装 | 信息管理系统通用代码 ---- 课程笔记

这个是B站Up主:程序员程子青的视频 C封装Mysql增删改查操作_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1m24y1a79o/?p6&spm_id_frompageDriver&vd_sourcea934d7fc6f47698a29dac90a922ba5a3安装mysql:mysql 下载和安装和修改MYSQL8.0 数据库存储…

SpringBoot 更新业务场景下,如何区分null是清空属性值 还是null为vo属性默认值?

先看歧义现象 值为null 未传递此属性 所以此时如何区分null 时传递进来的的null,还是属性的默认值null? 引入方案 引入过滤器,中间截获requestBodyData并保存到HttpServletRequest,业务层从HttpServletRequest 获取到requestBodyData辅…

【JavaScript】面向对象

重学JavaScript05----- 面向对象 文章目录 重学JavaScript05----- 面向对象前言JavaScript的面向对象面向对象的三大特征一、创建对象方式(封装)1、 直接创建方式弊端 思考属性描述符 2、工厂模式弊端 3、构造函数new操作符调用的作用构造函数创建对象弊…

一文读懂——如何把网站改成HTTPS访问

HTTPS(全称为Hyper Text Transfer Protocol Secure)是一种在计算机网络上进行安全通信的协议,它通过SSL/TLS证书对传输数据进行加密,确保了用户与服务器之间信息交换的私密性和完整性。 获取SSL/TLS证书 选择证书类型&#xff1a…

【问题+解决】axios/vue/element/echarts引入报错

缘由 笔者在html页面引用vue来快速实现页面&#xff1b;<head></head>中通过<script>src""></script>方法引入&#xff0c;开始引入&#xff0c;应用都是正常&#xff0c;后来用了也没问题&#xff1b;奇怪的是&#xff0c;前几天发现htm…

npm换源

检查现在的源地址 npm config get registry 使用淘宝镜像 npm config set registry https://registry.npm.taobao.org 使用官方镜像 npm config set registry https://registry.npmjs.org/