system()函数返回的退出码与预期不符

5
系统()函数似乎返回的是调用进程退出码的128倍。
从手册页可以看到:
返回值: 如过出错则返回-1(例如fork(2)失败),否则返回命令的返回状态码。
这是我得到的结果。
$ ls tinker.c
tinker.c
$ echo $?
0
$ ls notexisting
ls: cannot access notexisting: No such file or directory
$ echo $?
2
$ cat tinker.c
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    printf("%d\n", system("ls tinker.c"));
    printf("%d\n", system("ls notexisting"));
    return 0;
}
$ gcc tinker.c -o tinker
$ ./tinker 
tinker.c
0
ls: cannot access notexisting: No such file or directory
512

第一次调用表明我没有得到故障,但返回代码看起来与我从手册中读到的完全不同。我做错了什么?

3个回答

4

您引用系统手册的部分内容有所遗漏:

... 后者的返回状态是在wait(2)中指定的格式。 因此,命令的退出代码将是WEXITSTATUS(status)。

您需要将返回值右移8位(至少在Linux上),以获取命令的退出代码。

更具通用性的方法是直接使用宏本身。


3

来自POSIX system(3)

如果command不是空指针,则system()将以waitpid()指定的格式返回命令语言解释器的终止状态。

要获取返回代码,您需要使用WEXITSTATUS宏。


-2

0和512是命令的终止状态

如果命令成功执行,则返回0值,否则返回非零值。而这个非零值在不同的操作系统中是各不相同的。在我的Mac OS中,第二个system命令的返回值为256。

您还可以从这个问题`ls`退出状态中获得答案。


1
"0和512是该命令的终止状态。" 不一定。请参考其他答案的论据。 - alk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接