首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

wait函数返回值总结

wait函数返回值总结

之前在学习wait和waitpid函数的时候,就对使用宏WIFEXITED来检查获取的进程终止状态产生过疑惑:一般我们在程序中是调用的exit或者_exit函数来退出的,那么wait和waitpid函数获取的终止状态直接就是我们传递给exit的参数不就OK了吗?
    后来了解到是我考虑简单了,因为程序退出不仅仅只有我们显示地调用exit这么简单,还会有异常退出等情况,本文就对wait函数获取的状态做个总结!
    先来对wait status做个整体总结,一般我们通过wait status可以判定子进程发生了以下事件:
   (1)子进程通过传递一个整形参数给exit(或者_exit)而正常退出
   (2)子进程被一个信号终止
   (3)子进程被一个信号暂停(调用waitpid时指定WUNTRACED标志)
   (4)暂停的子进程被信号SIGCONT恢复(调用waitpid时指定WCONTINUED标志)
    平时我们说的进程termination status指的只是前两个wait status(可以通过$?来查看进程的termination status)。
    那么wait status是如何表示这些事件的呢? —— 具体如何表示的,不同的平台有不同的定义,因为POSIX并没有对实现做出详细的定义,这也是为什么推荐使用宏来检查wait status了,主要是考虑到程序可移植问题。本文针对x86平台32位。


    通过上图可以发现,虽然wait status是int型的,但实际上只使用了它的低2个字节。
    高8位用来记录正常退出状态,这也正解释了为什么程序退出状态的范围总是0~255。
    低8位用来记录信号。

    好了,现在来看看这些宏具体是如何实现的吧!
    在/usr/include/i386-Linux-gnu/sys/wait.h中


在/usr/include/i386-linux-gnu/bits/waitstatus.h中


继承事业,薪火相传
返回列表