系统()中的退出代码与预期不符

时间:2012-11-18 16:11:11

标签: c linux freebsd

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

第一个调用表明我没有收到失败,但返回代码看起来与我从手册页中读取的内容完全不同。我做错了什么?

3 个答案:

答案 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获得答案。