C 如何解释System()的返回值
How does the C++ interpret the return value of system()
我需要使我的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时,才应使用此宏。
- 从python中调用C++函数并获取返回值
- 为什么模板类中的对象不能返回值
- 返回值优化:显式移动还是隐式
- lock_guard是否保护返回值
- 调用CreateProcess()并获取字符串的返回值
- 如何使 windows 命令提示符在C++可执行文件上显示返回值?
- 编译器警告:执行到达值返回函数的末尾而不返回值
- 查找 GCD:并非所有控制路径都返回值
- 在 Arduino 上使用 sscanf 会导致与 const char * 不匹配,并且返回值始终相同,尽管输入值不同
- 将返回值存储在函数指针数组的指针中是如何工作的?
- 如何从 std::thread 返回值
- 将返回值从 exe 传递到 bat,并将其传递给 C# 中的进程
- 方法错误"not all control paths return a value"和方法不返回值
- 如何读取 C++ SAFEARRAY**,该 SAFEARRAY** 是 COM 互操作的结果,其中 C# 返回值为
- 对fread的返回值感到困惑
- 程序不向函数返回值
- 如何在另一个函数中使用返回值作为参数?
- 如何将C std ::未来返回值调整到C#System.Threading.tasks.task
- C 如何解释System()的返回值
- 使用 system() 执行命令返回返回值的 256 倍 ( << 8).这有什么意义