我有一个C程序,它调用一个AWK脚本,该脚本返回退出代码0或1.但是,当AWK脚本的退出代码为1时,我的C程序中对system的调用返回256.这些文件记录在哪里?这个值是依赖于系统还是总是转换为255+1?

$ cat test.c
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int exitCode;

    exitCode = system("awk '{ exit 0 }' test.c");
    printf("%d\n", exitCode);
    exitCode = system("awk '{ exit 1 }' test.c");
    printf("%d\n", exitCode);
    return 0;
}
$ gcc -o test -Wall test.c
$ ./test
0
256

推荐答案

如果您看一下systemman page,它说明了关于返回值的以下内容:

System()的返回值为下列值之一:

·如果命令为空,则为非零值(如果shell 为 可用,如果没有可用的shell ,则为0.

·如果无法创建子进程,或其状态可以 ,则返回值为-1,并将errno设置为 指出错误.

·如果无法在子进程中执行shell ,则 返回值就像是子shell 以 状态为127的CALING_EXIT(2).

·如果所有系统调用都成功,则返回值为 用于执行命令的子shell的终止状态. (shell的终止状态为终止状态 它执行的最后一个命令.)

In the last two cases, the return value is a "wait status" that
can be examined using the macros described in waitpid(2). (i.e.,
WIFEXITED(), WEXITSTATUS(), and so on).

System()不会影响任何其他子进程的等待状态.

因此,要查看程序的实际退出状态,您需要首先判断是否返回-1,如果没有,则在值上使用WEXITSTATUS来提取命令的退出状态.

exitCode = system("awk '{ exit 0 }' test.c");
if (exitCode == -1) {
    perror("system failed");
} else {
    printf("%d\n", WEXITSTATUS(exitCode));
}
exitCode = system("awk '{ exit 1 }' test.c");
if (exitCode == -1) {
    perror("system failed");
} else {
    printf("%d\n", WEXITSTATUS(exitCode));
}

C++相关问答推荐

如何启用ss(另一个调查套接字的实用程序)来查看Linux主机上加入的多播组IP地址?

C在声明带有值的数组时,声明大小有用吗?

在基本OpenGL纹理四边形中的一个三角形中进行渲染

如何有效地编写代码来判断两个元素数量相同的数组即使在不同的位置也具有相同的元素?

每次除以或乘以整数都会得到0.0000

getline()从c中的外部函数传递指针时输出null

这个计算C中阶乘的函数正确吗?

ifdef __cplusplus中的整数文字单引号

cairo 剪辑区域是否存在多个矩形?

通过描述符查找文件路径时出现问题

将变量或参数打包到 struct /联合中是否会带来意想不到的性能损失?

为什么编译器不能简单地将数据从EDI转移到EAX?

为什么我无法访问C语言中的文件

即使我在C++中空闲,也肯定会丢失内存

问题:C#Define上的初始值设定项元素不是常量

无算术运算符和循环的二进制乘法

可以';t从A9G模块拨打电话

如果类型是新的,offsetof是否与typeof一起工作?

段错误try 访问静态字符串,但仅有时取决于构建环境

Codewars Kata 掷骰子的不稳定行为