【Linux】进程结束和进程等待

news2025/3/1 0:41:36

进程的结束

退出码的认识

在我们学习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)进行实现,这样的好处当后续进行阅读代码时的,代码的可读性比较好,非阻塞式等待是当父进程在进行等待子进程退出的过程中还可以继续执行其他进程。非阻塞时需要进行轮回检测。

下面是阻塞等待和非阻塞等待的伪代码

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2276992.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Boot教程之五十五:Spring Boot Kafka 消费者示例

Spring Boot Kafka 消费者示例 Spring Boot 是 Java 编程语言中最流行和使用最多的框架之一。它是一个基于微服务的框架&#xff0c;使用 Spring Boot 制作生产就绪的应用程序只需很少的时间。Spring Boot 可以轻松创建独立的、生产级的基于 Spring 的应用程序&#xff0c;您可…

1月14日作业

将图形类的获取周长和获取面积函数设置成虚函数&#xff0c;完成多态 #include <iostream> #include <cmath> #define PI 3.14159 using namespace std;// 父类&#xff1a;图形类 class Shape { protected:double perimeter;double area; public:Shape():perimet…

基于Springboot + vue实现的文档管理系统

&#x1f942;(❁◡❁)您的点赞&#x1f44d;➕评论&#x1f4dd;➕收藏⭐是作者创作的最大动力&#x1f91e; &#x1f496;&#x1f4d5;&#x1f389;&#x1f525; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4dd;欢迎留言讨论 &#x1f525;&#x1f525;&…

Spring Boot 2 学习指南与资料分享

Spring Boot 2 学习资料 Spring Boot 2 学习资料 Spring Boot 2 学习资料 在当今竞争激烈的 Java 后端开发领域&#xff0c;Spring Boot 2 凭借其卓越的特性&#xff0c;为开发者们开辟了一条高效、便捷的开发之路。如果你渴望深入学习 Spring Boot 2&#xff0c;以下这份精心…

高级软件工程-复习

高级软件工程复习 坐标国科大&#xff0c;下面是老师说的考试重点。 Ruby编程语言的一些特征需要了解要能读得懂Ruby程序Git的基本命令操作知道Rails的MVC工作机理需要清楚&#xff0c;Model, Controller, View各司什么职责明白BDD的User Story需要会写&#xff0c;SMART要求能…

easyui datagrid表头和网格错位问题

问题&#xff1a;表头与数据网格错位 解决&#xff1a; 在onLoadSuccess事件中调用fitColumns方法 $(this).datagrid(‘fitColumns’);

React方向:react中5种Dom的操作方式

1、通过原生JS获取Dom去操作 通过document.querySelector(#title)原生js的方式去拿到dom节点&#xff0c;然后去进行操作。 import {Component} from "react";class App extends Component {//定义获取Dom的函数handleGetDom(){let title document.querySelector(#t…

【深度学习】多目标融合算法(二):底部共享多任务模型(Shared-Bottom Multi-task Model)

目录 一、引言 1.1 往期回顾 1.2 本期概要 二、Shared-Bottom Multi-task Model&#xff08;SBMM&#xff09; 2.1 技术原理 2.2 技术优缺点 2.3 业务代码实践 三、总结 一、引言 在朴素的深度学习ctr预估模型中&#xff08;如DNN&#xff09;&#xff0c;通常以一个行…

天机学堂3-ES+Caffeine

文章目录 day05-问答系统表 用户端分页查询问题目标效果代码实现 3.6.管理端分页查询问题ES相关 管理端互动问题分页实现三级分类3.6.5.2.多级缓存3.6.5.3.Caffeine 4.评论相关接口目标效果新增回答或评论 day05-问答系统 效果&#xff1a; 表 互动提问的问题表&#xff1a…

【Docker】Docker部署多种容器

关于docker&#xff0c;Windows上使用Powershell/CMD执行指令&#xff0c;Linux系统直接使用终端执行指令。 docker安装MySQL 拉取MySQL 也可以跳过拉取步骤&#xff0c;直接run&#xff0c;这样本地容器不存在的话&#xff0c;会自动拉取最新/指定的版本。 # 默认拉取最新…

【Flink】Flink内存管理

Flink内存整体结构图&#xff1a; JobManager内存管理 JVM 进程总内存(Total Process Memory)Flink总内存(Total Flink Memory)&#xff1a;JVM进程总内存减去JVM Metaspace(元空间)和JVM Overhead(运行时开销)上图解释&#xff1a; JVM进程总内存为2G;JVM运行时开销(JVM Overh…

如何规模化实现完全自动驾驶?Mobileye提出解题“新”思路

在CES 2025上&#xff0c;Mobileye展示了端到端自动驾驶系统Mobileye Drive™&#xff0c;通过高度集成的传感器、算法和计算平台&#xff0c;可以实现自动驾驶功能的全覆盖。 Mobileye创始人兼首席执行官Amnon Shashua教授 期间&#xff0c;Mobileye创始人兼首席执行官Amnon …

Qt 5.14.2 学习记录 —— 십일 QLCDNumber、QProgressBar、QCalendarWidget

文章目录 1、QLCDNumber2、ProgressBar3、QCalendarWidget 1、QLCDNumber 写一个倒计时程序。拖一个LCD Number到界面&#xff1a; 定时器用Qt的QTimer类&#xff0c;这个类的对象会产生一个timeout信号&#xff0c;通过start方法来开启定时器&#xff0c;并且参数中设定触发ti…

简要认识JAVAWeb技术三剑客:HTMLCSSJavaScript

目录 一、web标准二、什么是HTML三、什么是CSS四、什么是JavaScript 黑马JAVAWeb飞书在线讲义地址&#xff1a; https://heuqqdmbyk.feishu.cn/wiki/LYVswfK4eigRIhkW0pvcqgH9nWd 一、web标准 Web标准也称网页标准&#xff0c;由一系列的标准组成&#xff0c;大部分由W3C&…

sosadmin相关命令

sosadmin命令 以下是本人翻译的官方文档&#xff0c;如有不对&#xff0c;还请指出&#xff0c;引用请标明出处。 原本有个对应表可以跳转的&#xff0c;但是CSDN的这个[](#)跳转好像不太一样&#xff0c;必须得用html标签&#xff0c;就懒得改了。 sosadmin help 用法 sosadm…

【C语言】字符串函数详解

文章目录 Ⅰ. strcpy -- 字符串拷贝1、函数介绍2、模拟实现 Ⅱ. strcat -- 字符串追加1、函数介绍2、模拟实现 Ⅲ. strcmp -- 字符串比较1、函数介绍2、模拟实现 Ⅳ. strncpy、strncat、strncmp -- 可限制操作长度Ⅴ. strlen -- 求字符串长度1、函数介绍2、模拟实现&#xff08…

IO进程day6

一、思维导图 二、练习题1 有一个隧道&#xff0c;长1000m&#xff0c;有一辆高铁&#xff0c;每秒100米&#xff0c;有一辆快车&#xff0c;每秒50m 要求模拟这两列火车通过隧道的场景。 #include <stdio.h> #include <unistd.h> #include <pthread.h>pthre…

手撕代码: C++实现按位序列化和反序列化

目录 1.需求 2.流程分析 3.实现过程 4.总结 1.需求 在我们正在开发的项目&#xff0c;有这样一种需求&#xff0c;实现固定格式和自由格式的比特流无线传输。解释一下&#xff0c;固定格式形如下面表格&#xff1a; 每个字段都有位宽、类型等属性&#xff0c;这种固定格式一…

期望最大化算法:机器学习中的隐变量与参数估计的艺术

引言 在机器学习和统计学领域&#xff0c;许多实际问题涉及到含有隐变量的概率模型。例如&#xff0c;在图像识别中&#xff0c;图像的语义信息往往是隐变量&#xff0c;而我们能观测到的只是图像的像素值&#xff1b;在语音识别中&#xff0c;语音对应的文本内容是隐变量&…

2025封禁指定国家ip-安装xtables-addons记录

如何安装和使用 安装lux仓库(该仓库包含xtables-addons所需的依赖环境) # wget http://repo.iotti.biz/CentOS/7/noarch/lux-release-7-1.noarch.rpm # rpm -ivh lux-release-7-1.noarch.rpm 安装xtables-addons。注意&#xff1a;必须先安装kmod-xtables-addons&#xff0c;再…