进程等待与退出

news2024/9/20 1:02:52

目录

前言

0.进程如何退出

1.进程status的获取

2.进程status的组成

3.退出status的分用与验证

4.解释一下errno与waitpid输中status参数的关系 

5.status设计 


前言

我们在编写程序的时候,我们往往需要知道这个程序中的某个进程执行情况是怎么样的,在Linux平台下有“退出码”、“退出信号”来描述进程退出的结果,退出的结果会返回给该进程的父进程,对于云服务器来说实际上就是将我们搭载主函数的进程返回bash进程,那么对于我们主函数中创建的一级子进程,进程的结果自然就会返回给我们的主函数。本文要讨论的就是进程如何返回给父进程退出结果,以及推出结果有什么作用。


0.进程如何退出

一个进程有多种退出方式(部分):

①进程运行出错,被强制终止

②对进程发送信号,让进程终止

③使用exit()函数,进程返回结束

④return,函数返回结束

注意:进程一旦退出就一定有对应的退出码(与主函数的return返回值类似) 

1.进程status的获取

int main()
{
    pid_t id=fork();

    if(id==0)
    {
        exit(1);
    }
    int status;
    pid_t rid=waitpid(id,&status,0);
    std::cout<<"status: "<<status<<std::endl;
    return 0;
}

在这个示例代码中我们使用fork创建一个子进程并让其使用exit(),让子进程返回,其中返回值为1

pid_t waitpid(pid_t id,int &status,int option)
//等待成功返回等待进程的pid,
传入三个参数,
第一个参数表示要等待进程的id,
第二个参数是一个输出型参数,该参数会获得等待进程的进程退出状态码
第三个参数是关于如何等待的选择,0表示阻塞等待。
图1        程序运行结果

2.进程status的组成

图2        status数据分布

 进程status是一个32位的整数,其中这个整数的高16位不被使用全部被设置为0。对于该整数的低16位,其中的高8位用来存储进程的返回值,就是我们上文说到的使用exit()函数返回的值。其中的低8位,其中的低7位用来储存该进程接收到的信号,低8位的最高位用来存储core dump表示位。

在子进程没有接收到信号的时候,低16位中的高8位被允许使用。当子进程受到来自操作系统的信号的时候,高8位的内容就会失效。

core dump标识位(在博主的信号讲解部分还会在提到):这个标识位表示是否在文件异常或出错的时候,是否生成核心转储文件(core dump file)。这个文件中的内容可以帮助程序员对错误和异常进行分析,但是这个文件中可能包含用户的登入信息,会造成用户信息泄露,所以通常情况这个表示位是关闭的。即此bit位为0(本文默认关闭,即此bit为0)。

3.退出status的分用与验证

在第2部分中我们介绍了进程status的数据组成,本本分来进行验证。 该部分分为两部分进行验证。

先让子进程使用exit()函数进行退出,此时代码可以在不发送信号的情况下正常退出,所以信号接收部分为0,同时我们没有开启core dump标识位,所以整体低八位应该为0。

而后验证,发送信号到进程对进程status码低7位的影响。验证此部分,将子进程中注释的死循环打开,在该死循环中,我们获取子进程的pid,有了子进程的pid我们就可以向该进程发送信号。编译运行程序,我们这里假设向子进程发送9号信号(该信号可以强制终止进程)。

#include <iostream>
#include <unistd.h>
#include <sys/wait.h>

int main()
{
    pid_t id=fork();

    if(id==0)
    {
        // while(1)
        // {
        //     std::cout<<"i am childpid , my pid is "<<getpid()<<std::endl;
        // }
        exit(1);
    }
    int status;
    pid_t rid=waitpid(id,&status,0);
    std::cout<<"status: "<<status<<std::endl;

    //打印高八位内容
    std::cout<<"high_eight_bits: "<<((status>>8)&0xff)<<std::endl;
    
    //打印低八位内容
    std::cout<<"low_eight_bits: "<<(status&0xff)<<std::endl;
    
    //打印第八位中的最高位内容
    std::cout<<"highest_low_eight_bit: "<<((status>>7)&1)<<std::endl;

    return 0;
}
图3        对进程退出码高八位进行验证
图4        对进程发送信号验证其退出码中的低7位信息

对于图3结果,可做如下解释:

图5        对图3、图4结果解释

注意:这里进程的返回为什么使用exit(),而不使用return,这是因为,return是对函数的值返回,假如子进程调用了其他函数,其他函数可通过return返回一个值,但是子进程不会直接退出执行流。但是使用exit(),即使是exit()在被调用的函数中,也会立即令进程返回。当然exit与return在本部分所展示的代码中的子进程返回表现没有差异。 

4.解释一下errno与waitpid输中status参数的关系 

先说结论:二者没有任何关系

errno是在进程执行库函数和系统调用的时候被设置的,用来表明程序中的错误,本质上是一个与进程同级的全局变量,可以用来进行错误提示、区分错误类型、跨函数传递错误信息。

status是属于进程的一个变量,创建在父进程中,数据来源于子进程,由操作系统进行字段的填充与组合。本质上是一种进程间通信的手段,可以让父进程获取子进程的退出状态。

5.status设计 

子进程的等待值实际上是由程序员和操作系统共同维护的,当在进程中出现一些操作系统可容许的错误时,这个时候进程不会崩溃,也就是我们常说的程序运行时错误,比如缺少某些资源,但是不足以让程序崩溃,这个时候子进程的返回值主要由子进程的返回值来控制,程序员在编写代码时,可自行编写一份错误手册,并按照一定的编码方式将这个值返回,而后又操作系统写入status中。但,当进程发生操作系统不可容忍的操作时,比如除0错误、越权访问等,这个时候操作系统会立即出手并向进程发送信号,对进程进行处理,此时程序员设置的错误信息无效,子进程的返回值由操作系统主导。

按照图2中status的表现形式,我们可以做如下推断:

图6        进程返回与信号与运行结果的关系    

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

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

相关文章

我搞了一台switch

准确的说我搞了一台switch oled。为啥要买个游戏机呢&#xff1f;前些日子去轰趴馆团建&#xff0c;玩了一会switch&#xff0c;当时玩的游戏是《刺客信条3重制版》&#xff0c;感觉挺好玩的。我其实是手残党&#xff0c;很多网络游戏玩的都不是很好&#xff0c;而且大学的时候…

【阿一网络安全】如何让你的密码更安全?(二) - 非对称加密

上次《【阿一网络安全】如何让你的密码更安全&#xff1f;(一) - 对称加密》提到加密算法的对称加密&#xff0c;我们这次来聊聊非对称加密。 和对称加密不同&#xff0c;非对称加密的加密密钥和解密密钥不同。 非对称加密 大概过程就是&#xff0c;发送方使用公钥对明文数据…

Java 后端接口入参 - 联合前端VUE 使用AES完成入参出参加密解密

加密效果&#xff1a; 解密后的数据就是正常数据&#xff1a; 后端&#xff1a;使用的是spring-cloud框架&#xff0c;在gateway模块进行操作 <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>30…

Unity | 内存优化之Reserved Unity内存

目录 一、Render Texture资源 1.抗锯齿 2.阴影分辨率 3.深度 4.HDR格式 二、动画资源 1.Resample Curves 2.动画压缩 (1)Keyframe Reduction (2)Optimal(推荐) 3.剔除Scale曲线 (1)开启Remove Constant Scale Curves (2)使用脚本剔除scale曲线 4.降低精…

WordPress上可以内容替换的插件

插件下载地址&#xff1a;WordPress内容替换插件 – 果果开发 类型 替换的类型&#xff1a;文章、自定义文章类型、分类、标签、媒体库、页面、评论、数据库表&#xff0c;不同的类型可以替换不同的字段。 替换字段 替换的字段&#xff0c;哪些字段内容需要替换。除了数据库…

《系统架构设计师教程(第2版)》第17章-通信系统架构设计理论与实践-03-移动通信网网络架构

文章目录 1. 5GS与DN互连1.1 5GS概述1.2 5GS 与DN网络的连接关系1.3 UE连接DN的两种模式1.3.1 透明模式1.3.2 非透明模式 2. 5G 网络边缘计算 1. 5GS与DN互连 1.1 5GS概述 5GS&#xff1a;5G SystemDN&#xff1a;Data NetworkIMS&#xff1a;IP Media Subsystem&#xff08;一…

Android逆向(反调,脱壳,过ssl证书脚本)

文章目录 总结 基础Android基础工具 定位关键代码页面activity定位数据包参数定位堆栈追踪 编写反调脱壳好用的脚本过ssl证书校验抓包反调的脚本打印堆栈bilibili反调的脚本 总结 暑假做了两个月的Android逆向&#xff0c;记录一下自己学到的东西。对于app渗透有了一些思路。 …

Unity下如何播放8K超高分辨率的RTMP流?

在Unity中使用RTMP播放器播放8K流&#xff0c;需要考虑到多个方面的因素和技术要求。以下是一个详细的步骤和要点概述&#xff0c;帮助实现这一目标&#xff1a; 1. 选择合适的RTMP播放器插件 首先&#xff0c;需要选择一个支持8K视频流播放的RTMP播放器插件。并非所有插件都…

MATLAB绘图基础6:MATLAB绘图基础

参考书&#xff1a;《 M A T L A B {\rm MATLAB} MATLAB与学术图表绘制》(关东升)。 6.MATLAB绘图基础 6.1 MATLAB绘图基本流程 % 1.创建图形窗口; % 1.1 创建一个空白图形窗口; figure;% 1.2 创建一个带有指定标题的图形窗口; figure(Name, 图形窗口);% 1.3 创建一个具有指定…

【干货分享】基于SSM的体育场管理系统的开题报告(附源码下载地址)

中秋送好礼 中秋佳节将至&#xff0c;祝福大家中秋快乐&#xff0c;阖家幸福。本期免费分享毕业设计作品&#xff1a;《基于SSM的体育场管理系统》。 基于SSM的体育场管理系统的开题报告 一、课题背景与意义 随着全民健身理念的深入人心&#xff0c;体育场已成为广大师生和…

熟悉Kafka组成模块、Kafka消息提交的方式及优缺点

1. Kafka概念 1.1 Kafka组成模块 Kafka其实是一款基于发布与订阅模式的消息系统&#xff0c;如果按常理来设计&#xff0c;大家是不是把消息发送者的消息直接发送给消息消费者&#xff1f;但Kafka并不是这么设计的&#xff0c;Kafka消息的生产者会对消息进行分类&#xff0c;…

【LVI-SAM】激光雷达点云处理点云帧投影LIO-SAM 之ImageProjection实现细节

【LVI-SAM】激光雷达点云处理点云帧投影LIO-SAM 之ImageProjection实现细节 1. ImageProjection激光雷达点云预处理算法1.0 总结&#xff1a;1.1 功能概述&#xff1a;1.2 算法流程&#xff1a; 2. ImageProjection激光雷达点云预处理算法数学推倒3. ImageProjection激光雷达点…

安卓玩机工具------小米工具箱扩展工具 小米机型功能拓展

小米工具箱扩展版 小米工具箱扩展版 iO_Box_Mi_Ext是由晨钟酱开发的一款适用于小米&#xff08;MIUI&#xff09;、多亲&#xff08;2、2Pro&#xff09;、多看&#xff08;多看电纸书&#xff09;的多功能工具箱。该工具所有功能均可以免root实现&#xff0c;使用前&…

图解TCP三次握手|深度解析|为什么是三次

写在前面 这篇文章我们来讲解析 TCP三次握手。 TCP 报文段 传输控制块TCB&#xff1a;存储了每一个连接中的一些重要信息。比如TCP连接表&#xff0c;指向发送和接收缓冲的指针&#xff0c;指向重传队列的指针&#xff0c;当前的发送和接收序列等等。 我们再来看一下TCP报…

[高级人工智能 开放性调研] 近两年来[2022~2024]人工智能应用进展重要案例介绍

文章目录 [高级人工智能 开放性调研] 近两年来[2022-2024]人工智能应用进展重要案例介绍写在前面1. AIGC1.1 LLM | 大语言模型问答系统式的生成式AI文档解读——KimiChat代码生成——Cursor 1.2 AI绘画\视频生成 | Stable Diffusion | OpenAI SoraStable DiffusionOpenAI Sora …

模拟网络丢包常用方法以及工具

文章目录 背景常用方法代码实现使用方法测试代码 使用网络流量控制工具 常用工具Clumsy 背景 在软件开发过程中&#xff0c;经常需要模拟不同的网络环境来测试应用在不同条件下的表现。 这些模拟可以采用多种方式进行&#xff0c;包括在代码中实现随机丢包、随机延时、乱序&am…

《JavaEE进阶》----12.<SpringIOCDI【扫描路径+DI详解+经典面试题+总结】>

本篇博客主要讲解 扫描路径 DI详解&#xff1a;三种注入方式及优缺点 经典面试题 总结 五、环境扫描路径 虽然我们没有告诉Spring扫描路径是什么&#xff0c;但是有一些注解已经告诉Spring扫描路径是什么了 如启动类注解SpringBootApplication。 里面有一个注解是componentS…

【Leetcode152】乘积最大子数组(动态规划)

文章目录 一、题目二、思路三、代码 一、题目 二、思路 &#xff08;0&#xff09;读懂题意&#xff1a;题目的“连续”是指位置的连续&#xff0c;而不是说数字的连续&#xff0c;这是个大坑。 &#xff08;1&#xff09;确定状态&#xff1a;定义两个状态来记录当前子数组的…

Windows本地制作nginx证书

OpenSSL 是一个用于生成和管理 SSL/TLS 证书的工具。下载并安装 OpenSSL Select Additional Tasks页面勾选 The OpenSSL binaries (/bin) directory 将OpenSSL的bin目录配置到path中 开命令提示符&#xff08;cmd&#xff09;或 PowerShell。运行以下命令生成一个新的私钥和自…

哈希表的封装和位图

文章目录 2 封装2.1 基础框架2.2 迭代器(1)2.3 迭代器(2) 3. 位图3.1 问题引入3.2 左移和右移&#xff1f;3.3 位图的实现3.4 位图的题目3.5 位图的应用 2 封装 2.1 基础框架 文章 有了前面map和set封装的经验&#xff0c;容易写出下面的代码 // UnorderedSet.h #pragma on…