exit(-1)或者return(-1)shell得到的退出码为什么是
255
shell脚本返回执行结果下⾯我写了⼀个hello world程序,⼀起看看吧:
// filename: main.c
#include <stdio.h>
int main(void)
{
printf("hello wolrd!\n");
return(-);
}
编译执⾏:gcc main.c && ./a.out
现在我们看看在当前shell中返回上⼀个执⾏过程的返回值是多少,是 “-1” 吗?
inuyasha@inuyasha-Aspire-4741:~/桌⾯$ gcc main.c && ./a.out
hello world!
inuyasha@inuyasha-Aspire-4741:~/桌⾯$ echo $?
255
啊,结果为什么 "255"呢?调⽤⼀个程序, 程序退出-1, 得到结果不是“-1”吗?
这个问题简单的说, 是因为exit或者main函数中的return, 只能使⽤0~255之间的值. -1 的unsigned值就是255.
那么复杂点的说呢?
我们知道, 在Shell中, 运⾏⼀个命令, ⼀个程序, 都是fork⼀个⼦进程(然后exec)来执⾏的, ⽽这个程序的退出码, 被Shell(⽗进程),通过wait来收集⽽后报告给我们的.
pid_twait(int *statloc);
⽽对于wait来说, 历史上原因, 他将通过statloc返回⼀个16bit的interge(现在也有⽤32位表⽰的, 但是会兼容已有的设计). 这
16bits的interge中, ⾼8位就是程序退出的值(exit, 或者return), ⽽低⼋位表⽰导致这个程序退出的信号(其中⼀位表⽰是否有Core⽂件产⽣), 如果程序是正常退出, 那么低⼋位为0[1].
所以, 如果我们返回-1, 并且因为我们是正常退出, 所以Shell通过wait收集到的⼦进程退出状态是:
11111111 00000000
⽽⾼⼋位作为unsigned, 就是255了.
另外, 补充⼀下, 在Linux的内建Shell命令中, 很多都会遵守⼀个退出状态码的约定, 具体的值对应的意思[2]:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。