exit(-1)或者return(-1)shell得到的退出码为什么是255
下面我写了一个helloworld程序,一起看看吧:
//filename:main.c #include<stdio.h> intmain(void) { printf("hellowolrd!\n"); return(-); }
编译执行:gccmain.c&&./a.out
现在我们看看在当前shell中返回上一个执行过程的返回值是多少,是“-1”吗?
inuyasha@inuyasha-Aspire-4741:~/桌面$gccmain.c&&./a.out
helloworld!
inuyasha@inuyasha-Aspire-4741:~/桌面$echo$?
255
啊,结果为什么"255"呢?调用一个程序,程序退出-1,得到结果不是“-1”吗?
以下引用自:http://www.laruence.com/2012/02/01/2503.html
这个问题简单的说,是因为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收集到的子进程退出状态是:
1111111100000000
而高八位作为unsigned,就是255了.
另外,补充一下,在Linux的内建Shell命令中,很多都会遵守一个退出状态码的约定,具体的值对应的意思[2]: