我需要让我的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等?值是否取决于机器?
答案 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()返回。