C 如何解释System()的返回值

How does the C++ interpret the return value of system()

本文关键字:System 返回值 何解释 解释      更新时间:2023-10-16

我需要使我的C 程序执行bash脚本。所以我认为我需要使用system(),这是一个示例:

bash脚本test.sh

#!/bin/sh
exit 1

c :

int main()
{
    std::cout << system("./test.sh") << std::endl;
    return 0;
}

令我惊讶的是,我得到了256等。这是我发现的:

 test.sh | C++
---------|-----
 exit 0  | 0
 exit 1  | 256
 exit 2  | 512
...

我不知道为什么。是否可以获得0、1、2等?该值是否取决于机器?

该值是否取决于机器?

是(至少就C 标准而言)。

可以获得0、1、2等?

c 标准无法提供获得子过程的返回值的方法,但是Posix确实适用于您使用Linux。

返回值

如果命令是零指针,则System()应返回非零的指示,以指示命令处理器可用,如果没有可用,则零。[cx] [option start]当命令为null时,系统()函数应始终返回非零。[选项结束]

[cx] [option start]如果命令不是null指针,则系统()应以WaitPID()指定的格式返回命令语言解释器的终止状态。终止状态应为SH实用程序定义;否则,未指定终止状态。如果某些错误阻止了创建子进程后命令语言解释器执行,则来自System()的返回值的命令语言解释器已使用退出(127)或_EXIT终止(127)。如果无法创建子进程,或者无法获得命令语言解释器的终止状态,则System()应返回-1并设置errno表示错误。[选项结束]

waitpid()指定可用于从main()返回的值的宏。

wexitstatus(stat_val)

如果妻子x的值(stat_val)不为零,则该宏将评估儿童进程传递给_exit()或exit()或子流程的低排序8位的状态参数的低排序。从main()返回。

如评论中所述,system()的返回值已定义。
但是我认为您在Linux上,以下位置(请参阅system()的manpage):

返回值

返回的值为-1在错误(例如, fork(2)失败)和命令的返回状态。后一个返回状态的格式在等待(2)中指定。因此,命令的退出代码将为 wexitstatus(status)。如果无法执行/bin/sh P>

这意味着获得命令的退出状态使用WEXITSTATUS()

std::cout << WEXITSTATUS(system("./test.sh")) << std::endl;

wait()的manpage解释了 WEXITSTATUS(),这是在 stdlib.h 标题中定义的:

wexitstatus(status)

返回孩子的退出状态。这是由 status 参数的最低意义的8位组成的,该论点是在调用 exit (3)或 _EXIT (2)中指定的孩子。或作为main()中返回语句的参数。仅当 wirsxited 返回true时,才应使用此宏。