进程的退出

进程退出
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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值