当前位置: 首页 > 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下使用本地图片…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻

在如今就业市场竞争日益激烈的背景下&#xff0c;越来越多的求职者将目光投向了日本及中日双语岗位。但是&#xff0c;一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧&#xff1f;面对生疏的日语交流环境&#xff0c;即便提前恶补了…...

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

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

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

python报错No module named ‘tensorflow.keras‘

是由于不同版本的tensorflow下的keras所在的路径不同&#xff0c;结合所安装的tensorflow的目录结构修改from语句即可。 原语句&#xff1a; from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后&#xff1a; from tensorflow.python.keras.lay…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向&#xff0c;可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...