C ++如何解释system()的返回值

时间:2017-09-06 12:49:41

标签: c++ linux bash system

我需要让我的C ++程序执行一个bash脚本。所以我想我需要使用@JsonTypeInfo(include = As.PROPERTY, property = "class", use = JsonTypeInfo.Id.NONE) ,这是一个例子:

bash脚本system()

test.sh

C ++:

#!/bin/sh
exit 1

令我惊讶的是,我得到了int main() { std::cout << system("./test.sh") << std::endl; return 0; } 等。这是我发现的:

256

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

2 个答案:

答案 0 :(得分:1)

正如评论return value of system() is implementation defined所述 但我假设你在Linux上,其中包含以下内容(see manpage of system()):

  

返回值

     

错误时返回的值为-1(例如, fork(2)失败),否则返回命令的返回状态。后一种返回状态采用 wait(2)中指定的格式。因此,命令的退出代码将是 WEXITSTATUS(status)。如果无法执行 / bin / sh ,则退出状态将是执行 退出 的命令的退出状态(127)

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

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

manpage of wait()解释WEXITSTATUS(),它在 stdlib.h 标题中定义:

  

<强> WEXITSTATUS(状态)

     

返回子项的退出状态。这包括孩子在退出(3)或 _exit (2)的调用中指定的 status 参数的最低8位或者作为main()中return语句的参数。仅当 WIFEXITED 返回true时才应使用此宏。

答案 1 :(得分:1)

  

值是否取决于机器?

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

  

有可能得到0,1,2等吗?

C ++标准没有提供获取子流程返回值的方法,但是POSIX会这样做,因为您使用Linux后适用于您。

  

返回值

     

如果command是空指针,则system()应返回非零值以指示命令处理器可用,如果没有,则返回零。 [CX] [Option Start]当命令为NULL时,system()函数应始终返回非零值。 [选项结束]

     

[CX] [Option Start]如果command不是空指针,system()将以waitpid()指定的格式返回命令语言解释器的终止状态。终止状态应如sh实用程序所定义;否则,未指定终止状态。如果在创建子进程后某些错误阻止命令语言解释器执行,则system()的返回值应该像命令语言解释器使用exit(127)或_exit(127)终止一样。如果无法创建子进程,或者无法获取命令语言解释器的终止状态,则system()应返回-1并设置errno以指示错误。 [选项结束]

waitpid()指定一个宏,可用于提取从main()返回的值。

  

WEXITSTATUS(stat_val)

     

如果WIFEXITED(stat_val)的值不为零,则此宏将计算子进程传递给_exit()或exit()的status参数的低8位或子进程的值从main()返回。