system()函数似乎返回了我从它引起的进程中获得的退出代码的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
第一个调用表明我没有收到失败,但返回代码看起来与我从手册页中读取的内容完全不同。我做错了什么?
答案 0 :(得分:2)
来自POSIX system(3)
:
如果command不是空指针,system()将以waitpid()指定的格式返回命令语言解释器的终止状态。
要获取返回代码,您需要使用WEXITSTATUS
宏。
答案 1 :(得分:2)
您对系统手册页的引用错过了相关部分:
...后一种返回状态采用wait(2)中指定的格式。 因此,命令的退出代码将是WEXITSTATUS(状态)。
您需要将返回值右移8(至少在Linux上),以使命令退出代码。
便携式方法只是使用宏本身。
答案 2 :(得分:0)
0和512是命令的终止状态。
如果命令成功执行,则返回0值,否则返回非零值。并且这种非零值在不同的OS中是各种各样的。在我的mac os中,第二个system
命令的返回值是256。
您也可以从这个问题`ls` exit status获得答案。