【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。 基本使用: …...
【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)
可以使用Sqliteviz这个网站免费编写sql语句,它能够让用户直接在浏览器内练习SQL的语法,不需要安装任何软件。 链接如下: sqliteviz 注意: 在转写SQL语法时,关键字之间有一个特定的顺序,这个顺序会影响到…...
OkHttp 中实现断点续传 demo
在 OkHttp 中实现断点续传主要通过以下步骤完成,核心是利用 HTTP 协议的 Range 请求头指定下载范围: 实现原理 Range 请求头:向服务器请求文件的特定字节范围(如 Range: bytes1024-) 本地文件记录:保存已…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...
mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...
wpf在image控件上快速显示内存图像
wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包…...
libfmt: 现代C++的格式化工具库介绍与酷炫功能
libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全:…...
