目录

  • 一、对输出参数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字节。

  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)相与得到进程返回值。

2.宏函数

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

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

Linux 进程:进程退出返回值的获取相关推荐

  1. linux python脚本返回,在C/python中执行linux命令并得到返回值以及输出

    一般来说,用shell的方便之处在于,能够直接调用linux系统命令,方便的得到结果. 但是shell scprit的约束重重(这里不再讲了).下面说一下在C和python中如何调用linux命令.得 ...

  2. Python进程池的返回值

    同步或异步获取返回值 #p = Pool()#p.map(funcname,iterable) 默认异步的执行任务,且自带close,join功能#p.apply(), 同步调用进程池的方法#p.ap ...

  3. python进程process类返回值_Python 中的进程

    封面图片来源:沙沙野 内容概览进程必备的理论基础 进程的概念 并行和并发 进程的三状态 同步异步 进程模块 关于进程必备的理论基础操作系统的作用隐藏丑陋复杂的硬件接口,提供良好的抽象接口 管理.调度进 ...

  4. Shell函数(函数定义、函数变量、函数调用、函数传参、函数返回值、获取函数返回值)

    分享知识 传递快乐 1.函数定义 linux shell 可以用户定义函数,然后在shell脚本中可以随便调用.Shell 函数定义的语法格式如下: [function] funname [()]{函 ...

  5. linux中signal函数返回值,signal函数、sigaction函数及信号集操作函数

    信号是与一定的进程相联系的.也就是说一个进程可以决定在进程中对哪些信号进行什 么样的处理.例如一个进程可以忽略某些信号而只处理其他一些信号另外一个进程还可以选择如何处理信号.总之这些总与特定的进程相联 ...

  6. linux 所有命令的返回值

    linux命令返回值的妙用 在shell终端中,你所输入的一切命令其实都有返回值,而这个返回值默认保存在"$?"中,举例看一下 返回值的好处: 在编写shell脚本的时候我们要确认 ...

  7. linux中grep命令返回值,grep命令详解

    如果你是一个新手,请从头阅读这篇文章,如果你只是忘记了grep命令的一些常用选项,直接查看文章尾部的总结部分即可. 先说说grep命令能做什么? 我们可以使用grep命令在文本中查找指定的字符串,就像 ...

  8. python多线程返回值_python获取多线程及子线程的返回值

    最近有个需求,用多线程比较合适,但是我需要每个线程的返回值,这就需要我在threading.Thread的基础上进行封装 import threading class MyThread(threadi ...

  9. python curl 获取返回值_python获取系统命令的返回值 | curl in python

    项目背景: 通过curl 命令 从服务器获取数组,tids,然后导入到Mysql 表中. 自己想的方案: shell命令不熟悉,另外python中的数据库等接口都已封装,所以想使用Python来做,利 ...

最新文章

  1. 怎么更换WIN7欢迎界面的背景图?
  2. 关于TCP/IP协议及网络通信相关问题
  3. 线程锁定CPU linux,linux 线程与CPU绑定
  4. c语言把字符串写入文件,c语言文件读写 | 按字符,按行,按块
  5. 5-Scala对象(Class)和类(Object)
  6. 开发中git的常用命令
  7. 【软件工程导论题型大总结】画图题总结
  8. 如何利用labelImg软件标图
  9. 《App后台开发运维和架构实践》勘误
  10. (软考)系统分析师——标准化知识
  11. Equalizer并行渲染使用方法
  12. 桌面窗口管理器占用过高解决办法
  13. 德国质量链接中国速度,奥迪一汽新能源汽车有限公司在电动化赛道上全速奔跑
  14. 检测电池电量和充电状态
  15. 用Scheme打开网址方法
  16. CRF++安装教程(含Windows和Linux两个版本)
  17. 加密流量也能识别与管控,绿网借至强AI加速能力打造高效智能DPI方案
  18. Discuz开通VIP插件
  19. 从mpeg ts文件中提取I帧(3):pes包的解析
  20. 【科普】Xilinx 3D IC技术简介

热门文章

  1. Solidworks模型导入MATLAB过程
  2. ~Juniper的MX960型号运营商级别路由器简单测评~
  3. 戴顿大学电子与计算机工程技术,戴顿大学世界排名多少 综合和专业排名介绍...
  4. b s架构监控java,基于B/S的视频监控系统的设计与实现
  5. C#实现软件自动升级
  6. Python笔记— reversed()函数
  7. 浅谈AWS: IAM+S3+Lex+Lambda
  8. 传z播客 刘意_2015年Java基础视频笔记(day18~day20(2016年3月20日14:36:05)
  9. python 全栈开发,Day112(内容回顾,单例模式,路由系统,stark组件)
  10. 【渝粤题库】国家开放大学2021春4022