您的位置:首页 > 其它

进程的退出

2017-02-09 16:05 344 查看
进程退出

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: