Linux操作系统 进程(3)
接上文 Linux进程优先级之后,我们了解到僵尸进程与孤儿进程的形成原因,既然是因为父进程没有接收子进程的退出状态导致的,那么我们该如何去获取子进程的退出状态呢?那本篇文章将围绕这个问题来解释进程。
环境 : vscode 链接 Centos 7
进程退出状态
还记得我们刚开始学习C语言的时候 main 函数 return吗,这个就算是这个程序退出的信息,那么我们所谓的进程的退出信息有什么呢? 不就是 进程正常退出且运行结果正确, 进程正常退出且运行但结果不正确和进程异常退出,那么对于父进程来说,这些信息就是父进程在对子进程进一步规划或者说是下一步操作的关键信息。
echo $?
在终端页面上,我们可以使用 "echo $?" 去获取上一个进程的退出信息,我们可以写一个程序让他正常退出,和异常退出,用来展示退出信息的不同。
echo $?

既然在终端里,我们使用 echo $? 可以获得上一次进程退出的退出信息,那么Linux定义进程退出的退出信息是什么?
退出码 strerror
在官方文档定义中

我们可以通过函数来查看这些退出码分别对应的推出信息是什么,我们可以先尝试看几个
#include <iostream>
//#include <unistd.h>
#include <string.h>
using namespace std;int main()
{for (int i = 0; i < 5; i++){cout << i << ":" << strerror(i) << endl;}return 0;
}

errno
保存的最近的一次的错误码

我们可以尝试申请很大的一块空间让malloc失效去看看错误信息是什么
int main()
{int *p = (int *)malloc(1000 * 1000 * 1000 * 4); //4GB 后面学习后,程序被分配的所有空间也就4Gif(p==nullptr){cout << "errno" << ":" << errno << endl;perror("malloc error");}return 0;
}
![]()
_exit和exit
这两个函数一个是系统调用接口,一个是C语言库函数,主要的区别就在于C语言程序内部定义的缓冲区,在使用这两个函数终止程序的时候,系统调用接口_exit并不知道C语言程序内部存有缓冲区,并不会将其中的内容输出出来,但是exit会先把这个缓冲区内部信息先输出出来,再终止程序。
int main()
{printf("我存放在缓冲区内");//不使用 /n进行换行刷新缓冲区exit(12); //_exit()return 0;
}

但是使用_exit() 并不会输出任何信息

exit和_exit的退出信息也是退出码!
进程等待

进程等待是在等待谁呢? 那肯定不用想,就是等待子进程退出,接收到退出信息后,回收资源!
wait
函数参数的指针就是为了获取子进程的退出信息(因为C语言没有引用),函数返回值是当前等待到的进程的pid,我们可以让子进程return或者exit让父进程去获取退出信息 status
int main()
{pid_t id = fork();if(id == 0){printf("子进程pid: %d\n", getpid());exit(1);}else if(id < 0){perror("进程创建失败:");}else{int status;wait(&status);printf("子进程 status: %d\n",status);}return 0;
}

我们会发现,我们的exit退出信息是 1 ,但是为什么status 里返回的值是 256
status

在官方介绍中,status就是进程退出的具体信息,它将一个int分成几段,用这几段来返回不同的信息,同时我们可以看到,接口中提供了很多宏用来获取status里存放的不同段的返回信息,其中 WIFEXITED ,就是用来判断子进程是否正常返回,WEXITSTATUS 就是获得子进程退出信息,如果WIFEXITED 返回true ,子进程正常退出,子进程在正常退出的返回信息就使用WEXITSTATUS 进行获得(return exit)
int main()
{pid_t id = fork();if(id == 0){printf("子进程pid: %d\n", getpid());return 12;}else if(id < 0){perror("进程创建失败:");}else{int status;wait(&status);if(WIFEXITED(status)){printf("子进程 status: %d\n",status);printf("exit: %d\n", WEXITSTATUS(status));}else{printf("子程序异常退出\n");}}return 0;
}
这个WIFEXITED 是用来判断子进程是否由exit或者 return退出的,如果是就返回true然后我们就可以使用WEXITSTATUS 来查看正常退出的退出码

waitpid
wait函数可以回收所有子进程,获取他们的退出信息,但是如果我们想要对不同进程的退出进行不同的操作呢?
pid_t id
回收子进程id 为 这个id的进程 ,抽象,就是我们可以通过waitpid这个函数,并传入子进程的id,用来等待这个子进程,我们也可以通过传入参数为 -1 用来回收所有子进程。
int main()
{pid_t id1 = fork();if(id1 == 0){printf("子进程pid: %d\n", getpid());return 12;}else if(id1 < 0){perror("进程创建失败:");}pid_t id2 = fork();if(id2 == 0){printf("子进程pid: %d\n", getpid());return 14;}else if(id2 < 0){perror("进程创建失败:");}int status;waitpid(id1, &status, 0);//使用阻塞等待if (WIFEXITED(status)){printf("子进程 status: %d\n",status);printf("exit: %d\n", WEXITSTATUS(status));}else{printf("子程序异常退出\n");}waitpid(id2, &status, 0);//使用阻塞等待if (WIFEXITED(status)){printf("子进程 status: %d\n",status);printf("exit: %d\n", WEXITSTATUS(status));}else{printf("子程序异常退出\n");}return 0;
}

options
父进程对子进程的等待方式
参数 :0
阻塞等待,若等待的子进程没有结束,那父进程就会阻塞到当前语句,一直等待子进程结束,
参数 :WNOHANG
非阻塞轮询,父进程每一次运行到这个地方的时候,都会接收waitpid的返回值,返回0就是子进程还没有结束,返回非0就是子进程已经结束了,可以进行回收工作了!
int main()
{pid_t id1 = fork();if(id1 == 0){int ret = 3;while(ret--){printf("子进程任务ing pid: %d\n",getpid());sleep(1);}return 0;}else if(id1 < 0){perror("进程创建失败:");}else{int status;while (1){//waitpid(id1, &status, WNOHANG);//使用非阻塞轮询if(waitpid(id1, &status, WNOHANG)){if (WIFEXITED(status)){printf("子进程 status: %d\n",status);printf("exit: %d\n", WEXITSTATUS(status));}else{printf("子程序异常退出\n");}break;}sleep(1);printf("等待ing....\n");}}return 0;
}

相关文章:
Linux操作系统 进程(3)
接上文 Linux进程优先级之后,我们了解到僵尸进程与孤儿进程的形成原因,既然是因为父进程没有接收子进程的退出状态导致的,那么我们该如何去获取子进程的退出状态呢?那本篇文章将围绕这个问题来解释进程。 环境 : vsco…...
QQ频道机器人零基础开发详解(基于QQ官方机器人文档)[第五期]
QQ频道机器人零基础开发详解(基于QQ官方机器人文档)[第五期] 第五期介绍:频道模块之接口授权管理和发言管理 目录 QQ频道机器人零基础开发详解(基于QQ官方机器人文档)[第五期]第五期介绍:频道模块之接口授权管理和发言管理获取机器人在频道可用权限列表…...
代码签名证书快速申请指南
申请代码签名证书是确保软件或应用程序在分发和安装过程中不被篡改的重要步骤。以下是详细的快速申请指南: 一、选择证书品牌和服务商 选择知名证书品牌:首先,选择一个国际知名的代码签名证书品牌,如GlobalSign、Digicert、Comod…...
安卓 uniapp跨端开发
HBuilder X 4.24 本地插件方式使用原生插件 例如 MT-TTS 地址PS: 播放 speek({text: ‘test’}) 应为 播放 speak({text: ‘test’})MT-TTS下载下来之后,将 nativeplugins 文件夹拷贝到 uniapp 项目根目录中manifest.json ---- App原生插件配置 运行 语音引擎测试文字转语音播…...
【高阶用法】uniapp的i18n多语言模块修复与增强(Typescript)
痛点 在i18n多语言模块使用过程中,发现下面几个问题,需要解决 1)uni-best框架下,$t功能函数无法实时的切换语言,可能跟使用有关 2)uni-best建议的translate方式在vue块外使用太繁琐,希望不用…...
SQL Server Data Tools (SSDT)入门教程
SSDT (SQL Server Data Tools) 是微软提供的一款用于开发、设计和管理SQL Server数据库的工具。它集成在Visual Studio中,允许开发人员和数据库管理员在统一的环境中进行数据库开发与管理。以下是关于SSDT的详细介绍: 1. 什么是SSDT? SQL S…...
窗户检测系统源码分享
窗户检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vision …...
2.计算机网络基础
2. 计算机网络基础 (1) 计算机网络的定义 计算机网络是指将地理位置不同、具有独立功能的多个计算机系统通过通信线路和设备连接起来,以功能完善的网络软件实现网络中资源共享的系统。最简单的定义是:计算机网络是一些互相连接的、自治的计算机系统的集合。最庞大的计算机网…...
硬中断,软中断恢复位置
汇编初始化栈指针,interrupt,svc preserve8 ;preserve8 和 restore8 通常用于保护寄存器的状态;以确保在函数调用前后某些寄存器的值保持不变area reset,code,readonlycode32entryb startldr pc,do_undefined;这些地址不能随便写,0x0,0x4,0x8....这些…...
MySQL基础(13)- MySQL数据类型
目录 一、数据类型概述 1.MySQL中的数据类型 二、整型 1.数据类型可选属性 2.使用建议 三、浮点数、定点数、位类型 1.类型介绍 2.浮点类型 3.定点数类型 4.位类型 四、日期时间类型 1.YEAR 2.DATE 3.TIME 4.DATETIME 5.TIMESTAMP 6.TIMESTAMP和DATETIME的区别…...
数据结构------二叉树简单介绍及实现
如果不是满二叉树或者完全二叉树,就要用链式存储 //搜索二叉树:左子树的所有值比根小,右子树的所有值比根大 // 实现查找,最多找高度次(类似二分法) //二分查找存在的问题:…...
由一个 SwiftData “诡异”运行时崩溃而引发的钩深索隐(六)
概述 在 WWDC 24 中,苹果推出了数据库框架 SwiftData 2.0 版本。听说里面新增了能让数据记录“借尸还魂”的绝妙法器,到底是真是假呢? 我们在上篇博文中介绍了 History Trace 是如何稳妥的处理数据删除操作的。而在这里,我们将继续介绍 SwiftData 2.0 中另一个新特性:“墓…...
尚品汇-秒杀下单实现-页面轮询查询订单状态(五十三)
目录: (1)整合秒杀业务 (2)秒杀下单 (3)秒杀下单监听 (4)页面轮询接口 (1)整合秒杀业务 秒杀的主要目的就是获取一个下单资格,拥…...
2024年微电子与纳米技术国际研讨会(ICMN 2024) Microelectronics and Nanotechnology
文章目录 一、会议详情二、重要信息三、大会介绍四、出席嘉宾五、征稿主题六、咨询 一、会议详情 二、重要信息 大会官网:https://ais.cn/u/vEbMBz提交检索:EI Compendex、IEEE Xplore、Scopus大会时间:2024年9月20-22日地点:成都…...
2024最新版,人大赵鑫老师《大语言模型》新书pdf分享
本书主要面向希望系统学习大语言模型技术的读者,将重点突出核心概念与 算法,并且配以示例与代码(伪代码)帮助读者理解特定算法的实现逻辑。由于大语言模型技术的快速更迭,本书无法覆盖所有相关内容,旨在梳理…...
[Leetcode 543][Easy]-二叉树的直径-递归
目录 一、题目描述 二、整体思路 三、代码 一、题目描述 原题地址 二、整体思路 取一个结点的最大直径就是取一个结点的左子树最大深度右子树最大深度之和,因此可以定义一个递归函数,作用是取一个结点的最大直径。这个函数中还实现了求左子树最大深度…...
高级大数据开发学习路线指南
掌握大数据技术是一项系统性工程,涉及到广泛的技能和专业知识。为了帮助初学者构建坚实的基础,并逐步成长为大数据领域的专家,下面详细阐述了一条全面而深入的学习路线: 1. Java 编程基础 - 打造坚实的底层技能 关键知识点&…...
SpringBoot设置mysql的ssl连接
因工作需要,mysql连接需要开启ssl认证,本文主要讲述客户端如何配置ssl连接。 开发环境信息: SpringBoot: 2.0.5.RELEASE mysql-connector-java: 8.0.18 mysql version:8.0.18 一、检查服务端是否开启ssl认…...
2024-1.2.12-Android-Studio配置
本地博客: https://k1t0111.github.io/ K1T0 最近在做一些app方向的移动技术开发学习,但是由于AS的配置问题,市面上找不到最新的2024版本的AS的相关配置。笔者也是踩了很多坑,因此想写一篇文章记录一下最新的AS 2024 1.2.12的对应java环境的一…...
前端vue左侧树的一整套功能实现(一):vue2+vite封装v-resize指令,实现左侧树拖拽宽度和折叠展开
实现v-resize指令,具体以下功能: 指令接收宽度最大最小值,接收一个id用于localStorage存储拖拽宽度,接收padding拖拽时产生虚线拖拽,松开鼠标再进行元素宽度调整折叠展开图标使用本地图片 封装一个vite下使用本地图片…...
CSS Subgrid:网格布局的终极进化
CSS Subgrid:网格布局的终极进化当 Grid 遇见 Subgrid,嵌套布局终于有了完美的解决方案。一、Subgrid 解决了什么问题? 作为一名追求像素级还原的 UI 匠人,我深知嵌套网格的痛苦——子元素的网格线永远对不齐父元素,就…...
Net Insight推出可编程视频制作网络解决方案
随着实时媒体工作流程在设施、合作伙伴网络和云环境之间日益分布化,技术进步正在运营域之间创建可编程的分界点。基于这一动态趋势,Net Insight推出了可编程信任边界技术,使实时媒体互连在设施、网络和云环境之间传输时变得可预测。解释此次发…...
GitHub 热榜项目 - 日榜(2026-04-03)
GitHub 热榜项目 - 日榜(2026-04-03) 生成于:2026-04-03 统计摘要 共发现热门项目: 7 个 榜单类型:日榜 Token赞助:siliconflow 本期热点趋势总结 本期 GitHub 热榜呈现出 AI Agent 与基础模型深度集成的高度工程化趋势。技…...
Python逆向工程实战:如何从pyinstaller打包的.exe文件中找回丢失的源码(附工具包)
Python逆向工程实战:从PyInstaller打包的.exe文件中找回丢失的源码 当你辛苦编写的Python代码因为各种原因丢失,只剩下一个由PyInstaller打包的.exe文件时,那种绝望感我深有体会。作为一名经历过多次类似困境的开发者,我想分享一套…...
RSA算法在CTF竞赛中的实战应用与解题技巧
1. RSA算法基础回顾 RSA算法作为非对称加密的黄金标准,其安全性建立在大整数分解难题之上。我们先快速过一遍核心公式: 密钥生成: 选择两个大质数p、q,计算np*q欧拉函数φ(n)(p-1)(q-1)选择e满足1<e<φ(n)且gcd(e,φ(n))1计…...
计算机毕业设计:Python新能源汽车数据洞察与个性化推荐平台 Django框架 snowNLP 协同过滤推荐算法 requests爬虫 可视化(建议收藏)✅
博主介绍:✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业项目实战6年之久,选择我们就是选择放心、选择安心毕业✌ > 🍅想要获取完整文章或者源码,或者代做,拉到文章底部即可与…...
ai一键生成node.js环境配置教程,快马平台助你跳过繁琐安装步骤
最近在学习Node.js开发时,发现环境配置这个入门步骤对新手来说确实有点麻烦。不同操作系统下的安装方式差异大,版本选择也让人纠结。好在发现了InsCode(快马)平台的AI辅助开发功能,可以自动生成完整的配置教程,分享下我的使用体验…...
避坑指南:CATIA通过Excel导入材料库时遇到的5个典型错误及解决方法
CATIA与Excel材料库导入实战:从数据规范到自动化避坑全指南 引言:为什么材料库导入总出问题? 在工业设计领域,CATIA作为主流三维建模软件,其材料库管理直接影响产品仿真精度与设计效率。许多工程师习惯用Excel整理材料…...
ABAP ALV负数导出到Excel后无法合计
对金额字段进行以下处理即可CALL FUNCTION BAPI_CURRENCY_CONV_TO_EXTERN_9EXPORTINGcurrency <fs_alv>-waersamount_internal <fs_alv>-dmbtrIMPORTINGamount_external lv_external.<fs_alv>-dmbtr lv_external....
终极指南:如何掌握Ramjet动画中元素堆叠顺序实现丝滑变换效果
终极指南:如何掌握Ramjet动画中元素堆叠顺序实现丝滑变换效果 【免费下载链接】ramjet Morph DOM elements from one state to another with smooth animations and transitions 项目地址: https://gitcode.com/gh_mirrors/ra/ramjet Ramjet是一个强大的Java…...
