进程的退出
2016-01-06 19:07
225 查看
进程退出
A:正常退出,常见形式为在main()中的return,调用exit()类函数
B:非正常退出,比如信号引起的退出,或者调用abort()类函数给自己发信号
程序通过退出状态来向父进程(父进程可能就是shell)来报告一些有限的信息,由于历史上的原因(主要是wait类函数的实现),退出状态码
值限制在0-255
在通常的unix实现中,wait类函数得到的子程序状态是一个16位的整型。
这个整型的高8位即进程退出时exit()参数的低8位---或者说是main中return的值的低8位(由此可以看出,exit也好 main中return也好,
返回的值只有低8位有效);这个整型的低8位用来反映进程退出的原因:如果进程是正常退出的话,则这8位为0,如果进程因为信号退
出,则这8位中会编码引起进程退出的信号的信号值,这8位中还有一位用来表示有没有产生core
+-----------------+
| exit | signal |
+-----------------+
虽然现在大部分的机器和系统都讲这个wait的状态值放在了一个32位整型中了,但为了兼容之前的设计,还是只用到了其低16位
所以 我们在Unix或者类Unix环境下编程的时候需要注意一些约定
1,main中的return或者 exit类函数的参数值应该限定在0-255;通常我们用0来表示程序成功,1来表示程序执行异常;对于比较类程
序(用来比较两个参数的程序),0表示相同,1表示不相同,2表示无法比较。
2,在非posix的一些系统中,可能采用的约定和上面1中的不一样(比如有的系统用1表示成功,而0表示失败)。所以为了最大的兼容
性考虑,我们可以使用宏int EXIT_SUCCESS用于表示成功,int EXIT_FAILURE表示失败。
3,对于wait函数得到的结果,我们处于移植性的考虑,也需要使用宏来判断,而不是直接去分析其高8位低8位,比较常用的宏有
WIFEXITED(stat_val),WEXITSTATUS(stat_val),WIFSIGNALED(stat_val)等等。
4,进程的退出码和终止码是不一样的,比如,在调用exit引起的进程退出中,exit的参数是退出码(应该在0-255),而该退出码只是程
序终止码的一部分(这里指的是只是其高8位)
5,以上的讨论仅限于Unix及其衍生系统,比如windows系统的退出码就不受0-255的限制
System()函数的返回值:
system函数其实就是通过wait类函数来实现的,通过fork并用shell执行命令,并用wait来收集,所以system的返回值包含了多重意思
,这个可以参看其源码或者man手册来识别(比如glibc的2.1.3之前版本和之后版本对于system的行为就有所差异)。
1,system如果fork失败,则返回 -1
2,当system的参数为NULL时,posix标准要求要检查shell的可用性,如果可用则返回1,不可用则返回0 ;但在glibc2.1.3以及之前的
版本和其他某些C库版本中,并没有做检查,而是总返回1(即假设有shell可用)
3,当system参数不为NULL时,若exec执行失败 则返回127,否则,返回实际执行shell的状态码。
所以,由此可以看出,在我们一般的应用时(即 给出system参数),若system返回 -1, 则认为system直接执行失败;若sytem返回了127
,则无法判断到底参数命令到底有没有执行(除非我们知道该参数不会返回127);另外 除这两种情况外,最终得到的状态码,其实也
是shell的终止码,而不是具体命令的。所以这个system函数 很依赖于系统的shell. 这个需要查看 /bin/sh 对-c的实现。
Shell的$?反映了什么:
Bash的man手册中说的很含糊:? Expands to the exit status of the most recently executed foreground pipeline.
http://www.gnu.org/software/libc/manual/html_node/Program-Termination.html#Program-Termination http://stackoverflow.com/questions/2726447/why-is-the-exit-code-255-instead-of-1-in-perl http://stackoverflow.com/questions/179565/exitcodes-bigger-than-255-possible/ http://www.laruence.com/2012/02/01/2503.html
A:正常退出,常见形式为在main()中的return,调用exit()类函数
B:非正常退出,比如信号引起的退出,或者调用abort()类函数给自己发信号
程序通过退出状态来向父进程(父进程可能就是shell)来报告一些有限的信息,由于历史上的原因(主要是wait类函数的实现),退出状态码
值限制在0-255
在通常的unix实现中,wait类函数得到的子程序状态是一个16位的整型。
这个整型的高8位即进程退出时exit()参数的低8位---或者说是main中return的值的低8位(由此可以看出,exit也好 main中return也好,
返回的值只有低8位有效);这个整型的低8位用来反映进程退出的原因:如果进程是正常退出的话,则这8位为0,如果进程因为信号退
出,则这8位中会编码引起进程退出的信号的信号值,这8位中还有一位用来表示有没有产生core
+-----------------+
| exit | signal |
+-----------------+
虽然现在大部分的机器和系统都讲这个wait的状态值放在了一个32位整型中了,但为了兼容之前的设计,还是只用到了其低16位
所以 我们在Unix或者类Unix环境下编程的时候需要注意一些约定
1,main中的return或者 exit类函数的参数值应该限定在0-255;通常我们用0来表示程序成功,1来表示程序执行异常;对于比较类程
序(用来比较两个参数的程序),0表示相同,1表示不相同,2表示无法比较。
2,在非posix的一些系统中,可能采用的约定和上面1中的不一样(比如有的系统用1表示成功,而0表示失败)。所以为了最大的兼容
性考虑,我们可以使用宏int EXIT_SUCCESS用于表示成功,int EXIT_FAILURE表示失败。
3,对于wait函数得到的结果,我们处于移植性的考虑,也需要使用宏来判断,而不是直接去分析其高8位低8位,比较常用的宏有
WIFEXITED(stat_val),WEXITSTATUS(stat_val),WIFSIGNALED(stat_val)等等。
4,进程的退出码和终止码是不一样的,比如,在调用exit引起的进程退出中,exit的参数是退出码(应该在0-255),而该退出码只是程
序终止码的一部分(这里指的是只是其高8位)
5,以上的讨论仅限于Unix及其衍生系统,比如windows系统的退出码就不受0-255的限制
System()函数的返回值:
system函数其实就是通过wait类函数来实现的,通过fork并用shell执行命令,并用wait来收集,所以system的返回值包含了多重意思
,这个可以参看其源码或者man手册来识别(比如glibc的2.1.3之前版本和之后版本对于system的行为就有所差异)。
1,system如果fork失败,则返回 -1
2,当system的参数为NULL时,posix标准要求要检查shell的可用性,如果可用则返回1,不可用则返回0 ;但在glibc2.1.3以及之前的
版本和其他某些C库版本中,并没有做检查,而是总返回1(即假设有shell可用)
3,当system参数不为NULL时,若exec执行失败 则返回127,否则,返回实际执行shell的状态码。
所以,由此可以看出,在我们一般的应用时(即 给出system参数),若system返回 -1, 则认为system直接执行失败;若sytem返回了127
,则无法判断到底参数命令到底有没有执行(除非我们知道该参数不会返回127);另外 除这两种情况外,最终得到的状态码,其实也
是shell的终止码,而不是具体命令的。所以这个system函数 很依赖于系统的shell. 这个需要查看 /bin/sh 对-c的实现。
Shell的$?反映了什么:
Bash的man手册中说的很含糊:? Expands to the exit status of the most recently executed foreground pipeline.
http://www.gnu.org/software/libc/manual/html_node/Program-Termination.html#Program-Termination http://stackoverflow.com/questions/2726447/why-is-the-exit-code-255-instead-of-1-in-perl http://stackoverflow.com/questions/179565/exitcodes-bigger-than-255-possible/ http://www.laruence.com/2012/02/01/2503.html
相关文章推荐
- ELK stack 学习记录
- iOS几项容易出现循环引用的地方
- 浅谈Android性能优化方案
- Android shape属性详解
- LeetCode题解——Compare Version Numbers
- 一个简单的新闻应用
- 面向接口编程详解(三)——模式研究
- Business Intelligence——SSIS项目从创建到部署的简单总结(一)
- codevs 1380 没有上司的舞会
- 面向接口编程详解(二)——编程实例
- 高斯消元算法实现(Java)
- 离散--繁琐的定义
- 离散--第二节--证明方法
- ListView 请求(加载)可视区域Item的图片
- std::upper_bound
- JSON,ListView AsyncHttpClient 等第三方包的综合实应用
- iOS拨打电话(三种方法)
- 面向接口编程详解(一)——思想基础
- OPenCV视频的读取
- Qt中QPicture对报表的实现