当前位置: 首页 > news >正文

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进程优先级之后&#xff0c;我们了解到僵尸进程与孤儿进程的形成原因&#xff0c;既然是因为父进程没有接收子进程的退出状态导致的&#xff0c;那么我们该如何去获取子进程的退出状态呢&#xff1f;那本篇文章将围绕这个问题来解释进程。 环境 &#xff1a; vsco…...

QQ频道机器人零基础开发详解(基于QQ官方机器人文档)[第五期]

QQ频道机器人零基础开发详解(基于QQ官方机器人文档)[第五期] 第五期介绍&#xff1a;频道模块之接口授权管理和发言管理 目录 QQ频道机器人零基础开发详解(基于QQ官方机器人文档)[第五期]第五期介绍&#xff1a;频道模块之接口授权管理和发言管理获取机器人在频道可用权限列表…...

代码签名证书快速申请指南

申请代码签名证书是确保软件或应用程序在分发和安装过程中不被篡改的重要步骤。以下是详细的快速申请指南&#xff1a; 一、选择证书品牌和服务商 选择知名证书品牌&#xff1a;首先&#xff0c;选择一个国际知名的代码签名证书品牌&#xff0c;如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多语言模块使用过程中&#xff0c;发现下面几个问题&#xff0c;需要解决 1&#xff09;uni-best框架下&#xff0c;$t功能函数无法实时的切换语言&#xff0c;可能跟使用有关 2&#xff09;uni-best建议的translate方式在vue块外使用太繁琐&#xff0c;希望不用…...

SQL Server Data Tools (SSDT)入门教程

SSDT (SQL Server Data Tools) 是微软提供的一款用于开发、设计和管理SQL Server数据库的工具。它集成在Visual Studio中&#xff0c;允许开发人员和数据库管理员在统一的环境中进行数据库开发与管理。以下是关于SSDT的详细介绍&#xff1a; 1. 什么是SSDT&#xff1f; 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) 计算机网络的定义 计算机网络是指将地理位置不同、具有独立功能的多个计算机系统通过通信线路和设备连接起来,以功能完善的网络软件实现网络中资源共享的系统。最简单的定义是:计算机网络是一些互相连接的、自治的计算机系统的集合。最庞大的计算机网…...

硬中断,软中断恢复位置

汇编初始化栈指针&#xff0c;interrupt,svc preserve8 ;preserve8 和 restore8 通常用于保护寄存器的状态;以确保在函数调用前后某些寄存器的值保持不变area reset,code,readonlycode32entryb startldr pc,do_undefined;这些地址不能随便写&#xff0c;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的区别…...

数据结构------二叉树简单介绍及实现

如果不是满二叉树或者完全二叉树&#xff0c;就要用链式存储 //搜索二叉树&#xff1a;左子树的所有值比根小&#xff0c;右子树的所有值比根大 // 实现查找&#xff0c;最多找高度次&#xff08;类似二分法&#xff09; //二分查找存在的问题&#xff1a…...

由一个 SwiftData “诡异”运行时崩溃而引发的钩深索隐(六)

概述 在 WWDC 24 中,苹果推出了数据库框架 SwiftData 2.0 版本。听说里面新增了能让数据记录“借尸还魂”的绝妙法器,到底是真是假呢? 我们在上篇博文中介绍了 History Trace 是如何稳妥的处理数据删除操作的。而在这里,我们将继续介绍 SwiftData 2.0 中另一个新特性:“墓…...

尚品汇-秒杀下单实现-页面轮询查询订单状态(五十三)

目录&#xff1a; &#xff08;1&#xff09;整合秒杀业务 &#xff08;2&#xff09;秒杀下单 &#xff08;3&#xff09;秒杀下单监听 &#xff08;4&#xff09;页面轮询接口 &#xff08;1&#xff09;整合秒杀业务 秒杀的主要目的就是获取一个下单资格&#xff0c;拥…...

2024年微电子与纳米技术国际研讨会(ICMN 2024) Microelectronics and Nanotechnology

文章目录 一、会议详情二、重要信息三、大会介绍四、出席嘉宾五、征稿主题六、咨询 一、会议详情 二、重要信息 大会官网&#xff1a;https://ais.cn/u/vEbMBz提交检索&#xff1a;EI Compendex、IEEE Xplore、Scopus大会时间&#xff1a;2024年9月20-22日地点&#xff1a;成都…...

2024最新版,人大赵鑫老师《大语言模型》新书pdf分享

本书主要面向希望系统学习大语言模型技术的读者&#xff0c;将重点突出核心概念与 算法&#xff0c;并且配以示例与代码&#xff08;伪代码&#xff09;帮助读者理解特定算法的实现逻辑。由于大语言模型技术的快速更迭&#xff0c;本书无法覆盖所有相关内容&#xff0c;旨在梳理…...

[Leetcode 543][Easy]-二叉树的直径-递归

目录 一、题目描述 二、整体思路 三、代码 一、题目描述 原题地址 二、整体思路 取一个结点的最大直径就是取一个结点的左子树最大深度右子树最大深度之和&#xff0c;因此可以定义一个递归函数&#xff0c;作用是取一个结点的最大直径。这个函数中还实现了求左子树最大深度…...

高级大数据开发学习路线指南

掌握大数据技术是一项系统性工程&#xff0c;涉及到广泛的技能和专业知识。为了帮助初学者构建坚实的基础&#xff0c;并逐步成长为大数据领域的专家&#xff0c;下面详细阐述了一条全面而深入的学习路线&#xff1a; 1. Java 编程基础 - 打造坚实的底层技能 关键知识点&…...

SpringBoot设置mysql的ssl连接

因工作需要&#xff0c;mysql连接需要开启ssl认证&#xff0c;本文主要讲述客户端如何配置ssl连接。 开发环境信息&#xff1a; SpringBoot&#xff1a; 2.0.5.RELEASE mysql-connector-java&#xff1a; 8.0.18 mysql version&#xff1a;8.0.18 一、检查服务端是否开启ssl认…...

2024-1.2.12-Android-Studio配置

本地博客: https://k1t0111.github.io/ K1T0 最近在做一些app方向的移动技术开发学习&#xff0c;但是由于AS的配置问题&#xff0c;市面上找不到最新的2024版本的AS的相关配置。笔者也是踩了很多坑&#xff0c;因此想写一篇文章记录一下最新的AS 2024 1.2.12的对应java环境的一…...

前端vue左侧树的一整套功能实现(一):vue2+vite封装v-resize指令,实现左侧树拖拽宽度和折叠展开

实现v-resize指令&#xff0c;具体以下功能&#xff1a; 指令接收宽度最大最小值&#xff0c;接收一个id用于localStorage存储拖拽宽度&#xff0c;接收padding拖拽时产生虚线拖拽&#xff0c;松开鼠标再进行元素宽度调整折叠展开图标使用本地图片 封装一个vite下使用本地图片…...

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…...

Keil 中设置 STM32 Flash 和 RAM 地址详解

文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

分布式增量爬虫实现方案

之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面&#xff0c;避免重复抓取&#xff0c;以节省资源和时间。 在分布式环境下&#xff0c;增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路&#xff1a;将增量判…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...

scikit-learn机器学习

# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...