为什么是$?调用system()后总是0?

时间:2011-12-23 07:43:27

标签: c linux

我在Linux下测试这个小程序:

// foo.c
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{
    int n = system(argv[1]);
    printf("%d\n", n);
    return n;
}

无论输入命令行的是什么,echo $?总是打印0,例如:

$ ./foo anything
sh: anything: not found
32512
$ echo $?
0

我的问题是:为什么$?与[{1}}的价值相同?我还在Win32下测试了该程序,n给出了与echo %errorlevel%相同的值。谢谢!

2 个答案:

答案 0 :(得分:6)

如果以八进制或十六进制打印n,您将发现它的低字节始终为0.

如果您return WEXITSTATUS(n);,您的程序将以您期望的状态退出。

仔细阅读man systemman wait,您就会理解。

答案 1 :(得分:2)

只有低8位的返回值被识别为退出状态,因为退出状态是由WEXITSTATUS宏计算的,请参阅SUSv4