【Linux】进程结束和进程等待
进程的结束
退出码的认识
在我们学习C/C++的时候我们通常在进行写main函数时,main函数主体写完后通常会进行写一条语句 " return 0 " ,这里的这条语句到底是什么意思呢??
我们知道当在主函数中调用其他函数或者在其他函数中实现函数调用时,return 进行返回时是将return 后面的语句进行返回到调用该函数内,通过变量进行接收,main函数中return 后面的返回值其实就是退出码。
退出码的概念
退出码是用来标定程序执行结果是否正确。
进程退出的情况
- 进程跑完了,并且进程结果正确------------return 0
- 进程跑完了,但是进程的结果不正确------return !0
- 进程没有跑完中途挂掉了,此时退出码没有意义
查看进程码
命令:echo $?
查看最近一个进程运行的退出码


- 思考:为什么进行查询完test程序的退出码后,在进行查询进程的退出码后显示进程的退出码为0呢??
答案是进行查看进程退出码的命令也是一个进程,该进程正常结束,所以通过查询最近一条进程的退出码是0。
如何设定main函数的退出码??
当我们不关心程序程序的退出码时,直接返回0即可;当我们关心进程的退出码时,此时就需要返回特定的退出码。
特定的退出码一般代表特定的错误
这种通过打印退出码的方式对计算机是非常友好的,但是对人是非常不友好的,所以我们通常将退出码进行文字描述,进行文字描述既可以自定义进行实现,也可以通过使用系统中的映射关系。
利用库函数strerror进行打印所有错误码和错误码的描述(系统)

错误码进行自定义描述
进程中止的三种方式
- main函数的return
- exit:exit是C语言的库函数
- _exit:_exit 是系统调用
exit和return 的区别


exit不需要在main函数中即可达到main函数中return的效应,直接退出程序并将错误码进行保留。
exit和_exit的区别
当存在换行符时,在main函数中进行打印ret结果可以进行呈现出来


当不存在换行符时,通过exit进行中止的进程ret还是可以被打印出来,但是_exit进行中止进程的ret没有显现


产生上面现象的原因是 _exit之所以没有显现出来是因为ret的内容进行放到了缓冲区中,exit是可以进行刷新缓冲区的,但是_exit不会进行刷新缓冲区。
- 这个缓冲区到底存在于哪里呢??是操作系统吗?

答案是不是,因为库函数exit就是通过调用系统接口_exit进行实现的,要是这个缓冲区存在于操作系统的话,exit和_exit结果应该是一致的。
其实这个缓冲区存在于用户层面。
进程等待
为什么要进行进程等待?
进程中有一种状态是僵尸状态,进程长期处于僵尸状态会造成内存泄漏,进程等待就是为了解决僵尸进程问题。回收子进程的资源,获取子进程的退出状态。
解决僵尸问题的方法
wait和waitpid


注意事项:头文件两个都必须要进行包含,其中wait和waitpid中的参数status是指向整数的指针,用于存储子进程的退出状态。
观察解决僵尸进程现象


刚开始两个进程处于休眠状态,之所以是休眠状态而不是运行时状态我们之前都已经详细讲过这里就不在进行详细介绍,然后子进程进行退出,此时父进程正在sleep 没有通过wait进行回收子进程,此时的子进程处于僵尸状态,当父进程将子进程的资源进行回收,并且获取子进程退出状态。
wait系列回去子进程的退出信息的本质
wait和waitpid进行解决僵尸进程的问题是通过读取僵尸进程task_struct结构体中的exit_code和exit_signal来进行获取子进程的退出状态的。
wait和waitpid参数的认识
pid:指定父进程要等待的子进程的进程 ID。这个参数可以有多种取值方式:pid > 0:父进程等待进程 ID 为pid的子进程。pid == 0:父进程等待任何属于同一个进程组的子进程。pid == -1:父进程等待任何子进程(行为与wait相同)。pid < -1:父进程等待进程组 ID 为|pid|的子进程。
status:与wait调用相同,用于接收子进程的退出状态。options:可以使用以下选项控制waitpid的行为:WNOHANG:非阻塞模式,立即返回。如果没有子进程退出,则返回 0。WUNTRACED:如果子进程停止(例如,通过接收到信号),也返回状态信息。WCONTINUED:如果子进程在停止后继续运行,返回状态信息
接收进程的退出状态 status 的底层

通过上面的现象我们想要获取的子进程的退出状态是exit返回给父进程的15,但是我们通过status获取的子进程的退出状态竟然是3840这一串数字,其实status获取子进程的退出状态并不是按照整数的整体进行获取的,而是按照以下方式进行编码的。
退出状态的编码
退出状态一般是一个 16 位的整数,具体编码方式如下:
- 低 8 位:包含子进程的退出状态码(对于正常退出是
exit()返回的值)。 - 高 8 位:用于指示子进程是否因信号终止。
底层的方法

宏封装的方法

阻塞式等待和非阻塞式等待
阻塞式等待
对于options的参数,我们默认是进行传入参数0,此时父进程进行等待子进程退出的方式是阻塞式等待,当子进程并未进行退出时,父进程加入到阻塞队列中,等待CPU的调度,父进程处于休眠状态,当父进程接收到子进程的退出信号时,父进程被激活开始进行回收子进程并获取子进程的退出状态。
操作系统中的阻塞式等待给我们用户层的主管感受就是系统好像卡住了,例如cin 和scanf 在等待我们进行输入时
非阻塞式等待
当将options的参数进行传入1时,此时父进程进行等待子进程的方式时非阻塞式等待,但是我们通常不是通过传入数字1进行的,而是通过定义宏(WNOHANG)进行实现,这样的好处当后续进行阅读代码时的,代码的可读性比较好,非阻塞式等待是当父进程在进行等待子进程退出的过程中还可以继续执行其他进程。非阻塞时需要进行轮回检测。
下面是阻塞等待和非阻塞等待的伪代码


相关文章:
【Linux】进程结束和进程等待
进程的结束 退出码的认识 在我们学习C/C的时候我们通常在进行写main函数时,main函数主体写完后通常会进行写一条语句 " return 0 " ,这里的这条语句到底是什么意思呢?? 我们知道当在主函数中调用其他函数或者在其他函…...
可编辑精品PPT | 城投集团(行业)数字化解决方案
这个PPT详细介绍了城投集团的数字化转型解决方案。首先,它概述了数字化转型的背景,包括政策要求和行业趋势,并指出集团在信息化方面取得的阶段性成果及存在的不足。方案提出了数字化转型的总体规划,明确了总体目标、思路和推进策略…...
统计学习算法——决策树
内容来自B站Up主:风中摇曳的小萝卜https://www.bilibili.com/video/BV1ar4y137GD,仅为个人学习所用。 问题引入 有15位客户向某银行申请贷款,下面是他们的一些基本信息,类别列表示是否通过贷款申请,是表示通过贷款申…...
基于网络爬虫技术的网络新闻分析
文末附有完整项目代码 在信息爆炸的时代,如何从海量的网络新闻中挖掘出有价值的信息呢?今天就来给大家分享一下基于网络爬虫技术的网络新闻分析的实现过程。 首先,我们来了解一下系统的需求。我们的目标是能够实时抓取凤凰网新闻、网易新闻、…...
51_Lua面向对象编程
面向对象编程(Object Oriented Programming,OOP)是一种非常流行的计算机编程架构。像C++、Java、Objective-C、Smalltalk、C#、Ruby等编程语言都支持面向对象编程。 1.面向对象编程特性 面向对象编程是一种编程范式,它使用“对象”来设计软件。对象是数据和行为的封装单元…...
关于在 Kotlin DSL 中,ndk 的配置方式
在 Kotlin DSL 中,ndk 的配置方式有所不同,取决于 Android Gradle 插件版本。ndk { abiFilters(…) } 在 Kotlin DSL 中实际上是 externalNativeBuild 的一部分,需要通过正确的上下文调用。 错误代码: ndk {abiFilters("ar…...
【论文阅读+复现】High-fidelity Person-centric Subject-to-Image Synthesis
以人物为中心的主体到图像的高保真合成,CVPR2024 code:CodeGoat24/Face-diffuser: [CVPR2024] Official implementation of High-fidelity Person-centric Subject-to-Image Synthesis. paper:2311.10329 背景 研究问题:这篇文…...
Spring Boot 应用开发入门
一、Spring Boot简介 Spring Boot 是一个基于 Spring 框架的开源 Java 基础框架,它简化了基于 Spring 的应用开发。Spring Boot 提供了一种快速、便捷的方式来创建独立、生产级的基于 Spring 框架的应用程序。它通过提供一系列的“启动器”依赖,帮助开发…...
【C语言】字符串函数详解
文章目录 Ⅰ. strcpy -- 字符串拷贝1、函数介绍2、模拟实现 Ⅱ. strcat -- 字符串追加1、函数介绍2、模拟实现 Ⅲ. strcmp -- 字符串比较1、函数介绍2、模拟实现 Ⅳ. strncpy、strncat、strncmp -- 可限制操作长度Ⅴ. strlen -- 求字符串长度1、函数介绍2、模拟实现(…...
【Vim Masterclass 笔记14】S07L29 + L30:练习课08 —— Vim 文本对象同步练习(含点评课内容)
文章目录 L29 Exercise 08 - Text Objects1 训练目标2 操作指令2.1. 打开 textobjectspractice.txt 文件2.2. 单词对象练习 Word Objects2.3. 区块对象 ( ) 练习 Block Object ( )2.4. 引用字符串练习 Quoted Strings2.5. 区块对象 [ ] 练习 Block Object [ ]2.6. 区块对象 <…...
非PHP开源内容管理系统(CMS)一览
在现代网站开发中,内容管理系统(CMS)是不可或缺的工具。虽然许多广泛使用的CMS(如WordPress和Joomla)是基于PHP开发的,但其他编程语言同样诞生了许多优秀的开源CMS,适用于不同需求和技术栈的项目…...
WEB 攻防-通用漏-XSS 跨站脚本攻击-反射型/存储型/DOMBEEF-XSS
XSS跨站脚本攻击技术(一) XSS的定义 XSS攻击,全称为跨站脚本攻击,是指攻击者通过在网页中插入恶意脚本代码,当用户浏览该网页时,恶意脚本会被执行,从而达到攻击目的的一种安全漏洞。这些恶意脚…...
SQLAlchemy -批量插入时忽略重复
PostgreSQL 有一个很棒的INSERT() ON CONFLICT DO NOTHING子句,您可以将其与 SQLAlchemy 一起使用: from sqlalchemy.dialects.postgresql import insert session.execute(insert(MyTable).values(my_entries).on_conflict_do_nothing())MySQL 有类似的INSERT IGNORE子句,但…...
1月13日学习
[HITCON 2017]SSRFme 直接给了源代码,题目名称还是ssrf,那么该题大概率就是SSRF的漏洞,进行代码审计。 <?php// 检查是否存在 HTTP_X_FORWARDED_FOR 头,如果存在,则将其拆分为数组,并将第一个 IP 地址…...
Steam个人开发者注册备记
具体的注册过程有很多同志已经写过了,这里只写一点自己搞得有点费劲的地方。有点久了记得也不多了。 1.姓名用汉语拼音,参考护照上的,一般是Zhang Sanli这样的格式,姓一个单词,名字一个单词(不管1个字还是…...
django在线考试系统
Django在线考试系统是一种基于Django框架开发的在线考试平台,它提供了完整的在线考试解决方案。 一、系统概述 Django在线考试系统旨在为用户提供便捷、高效的在线考试环境,满足教育机构、企业、个人等不同场景下的考试需求。通过该系统,用…...
Laravel 中 Cache::remember 的基本用途
在 Laravel 中,Cache::remember 方法用于缓存数据,以提高应用程序的性能。当需要从数据库或其他较慢的数据源中检索数据时,可以使用 Cache::remember 来检查请求的数据是否已经被缓存。如果数据已缓存,则直接从缓存中读取…...
前端进程和线程及介绍
前端开发中经常涉及到进程和线程的概念,特别是在浏览器中。理解这两个概念对于理解浏览器的工作机制和前端性能优化非常重要。以下是详细介绍: 1. 什么是进程和线程? 进程: 是操作系统分配资源的基本单位。一个程序启动后…...
OpenGL —— 基于Qt的视频播放器 - ffmpeg硬解码,QOpenGL渲染yuv420p或nv12视频(附源码)
运行效果 工程说明 源码 vertex.glsl...
Vue Router
Vue Router4 匹配 Vue3;Vue Router3 匹配 Vue2。 Vue Router 是 Vue.js 官方的路由管理器。Vue Router 基于路由和组件的映射关系,监听页面路径的变化,渲染对应的组件。 安装: npm install vue-router。 基本使用: …...
23-Oracle 23 ai 区块链表(Blockchain Table)
小伙伴有没有在金融强合规的领域中遇见,必须要保持数据不可变,管理员都无法修改和留痕的要求。比如医疗的电子病历中,影像检查检验结果不可篡改行的,药品追溯过程中数据只可插入无法删除的特性需求;登录日志、修改日志…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
重启Eureka集群中的节点,对已经注册的服务有什么影响
先看答案,如果正确地操作,重启Eureka集群中的节点,对已经注册的服务影响非常小,甚至可以做到无感知。 但如果操作不当,可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
django blank 与 null的区别
1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是,要注意以下几点: Django的表单验证与null无关:null参数控制的是数据库层面字段是否可以为NULL,而blank参数控制的是Django表单验证时字…...
软件工程 期末复习
瀑布模型:计划 螺旋模型:风险低 原型模型: 用户反馈 喷泉模型:代码复用 高内聚 低耦合:模块内部功能紧密 模块之间依赖程度小 高内聚:指的是一个模块内部的功能应该紧密相关。换句话说,一个模块应当只实现单一的功能…...
Linux 下 DMA 内存映射浅析
序 系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存,但最终会调到 DMA 子系统的dma_alloc_coherent()/dma_alloc_attrs() 等接口。 关于 dma_alloc_coherent 接口详细的代码讲解、调用流程,可以参考这篇文章,我觉得写的非常…...
