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

Linux 进程:进程退出返回值的获取

目录

  • 一、对输出参数status的理解
  • 二、获取进程退出返回值
    • 1.位运算
      • (1)异常退出码
      • (2)进程返回值
    • 2.宏函数

  我们常使用函数 waitwaitpid 来执行进程等待的功能:处理退出的子进程并释放资源,防止子进程变成僵尸进程。而这两个函数都有一个输出参数status,我们可以通过这个输出参数来获取进程的退出返回值。但是进程的退出返回值并不是直接将status解引用就可以得到的,详细原因且看下文。

  • pid_t wait(int *status);
  • pid_t waitpid(pid_t pid, int *status, int options);

一、对输出参数status的理解

  在wait和waitpid中,输出参数status存储了子进程的退出返回值,但是并不是直接解引用就可以得到子进程的退出返回值。

  status解引用后是int型变量,占据四个字节的内存空间。但它的四个字节并不是都存储着进程的退出返回值。如图所示:我们给每个字节从高地址到低地址依次编号:1、2、3、4字节。

4字节

  1、2字节在这里我们用不上,因此不做讨论。

  3号字节存储的是子进程的退出返回值,也就是说,只有8个比特位才是用来存储进程退出返回值的。

  4号字节的低7位存储异常退出码(当程序异常退出时,异常退出码就可以表示程序是因为什么异常而退出的),如果异常退出码不是0说明进程是异常退出。4字节的最高1位是coredump标志,这里不作讨论。

  在获取子进程的退出返回值之前,首先需要获取异常退出码,判断异常退出码是不是0。如果是0,说明是正常退出,可以去获取进程的退出返回值了;如果异常退出码不是0,说明是异常退出,那么就没有必要获取进程的退出返回值了。

二、获取进程退出返回值

 我们有两种方式可以获取status中的退出返回值和异常退出码:

  • 位运算
  • 宏函数

1.位运算

(1)异常退出码

  因为异常退出码占用的是4号字节中的低7位,因此我们可以通过(*status)和16进制数(0x7f)进行与运算得到异常退出码。

  如图:第一行是status解引用后的数,第二行是0x7f的二进制表示,不管高25位是什么数字,只要和0相与都变成0,而低7位依然保持原样,因此可以得到异常退出码。

异常退出码

(2)进程返回值

  进程返回值占用的是3号字节中的8个bit,因此需要把(*status)进行右移8位,如图所示。

  这样进程返回值就变成了低8位,然后使用上面的方法,把右移后的数据和16进制数(0xff)相与得到进程返回值。

右移8位

2.宏函数

   WIFEXITED(status) 等价于 ( (*status)&(0x7f) )==0 ,当异常退出码是0,宏函数返回true,表示进程的退出返回值有意义,可以去获取。

  WEXITSTATUS(status) 等价于 ( (*status >> 8)&(0xff) ),这样直接就可以得到进程的退出返回值。

http://www.lryc.cn/news/29141.html

相关文章:

  • JavaScript核心高级内容复习1
  • 2D图像处理:Qt + Opencv使用光度立体法检测Halcon中提供的缺陷图像
  • 怎样用sql去查一个订单表中一个店铺一段时间的营业收入的环比
  • SpringSecurity: 默认添加的15个Filter是怎么添加进去的?
  • 学习记录---latent code 潜在编码
  • Cesium三维数据格式以及生产流程详解(glb,osgb,obj,bim,ifc)等
  • 2023年备考信息安全工程师每日知识点(1)
  • Unity记录3.1-地图-TileMap简单使用、鼠标拖动放置Tile
  • Decoupled Knowledge Distillation(CVPR 2022)原理与代码解析
  • IronWebScraper 2023.2.2 Crack
  • 【2.1 golong中条件语句if】
  • Scala编程(第四版)
  • aws apigateway 基础概念和入门示例
  • 2023年“中银杯”安徽省职业院校技能大赛网络安全A模块全过程解析
  • 【Python入门第二十四天】Python 迭代器
  • Qt扫盲-CMake 使用概述
  • minGW-w64配置途径
  • 程序、进程、线程的基本概念、信号量的PV操作、前趋图的PV操作
  • 设计测试用例
  • CSS 选择器以及CSS常用属性
  • 测试概念及模型
  • 王道计算机组成原理课代表 - 考研计算机 第六章 总线 究极精华总结笔记
  • 【C++升级之路】第八篇:string类
  • mysql性能优化_原理_课程大纲
  • 项目管理报告工具的功能
  • centos8上安装hbase
  • linux 进程及调度基础知识
  • Python计算分类问题的评价指标(准确率、精确度、召回率和F1值,Kappa指标)
  • 51单片机LCD1602的使用
  • [深入理解SSD系列综述 1.5] SSD固态硬盘参数图文解析_选购固态硬盘就像买衣服?