当我在Linux上运行的system(COMMAND)
代码中使用C++
函数执行命令时,
system(COMMAND)
的调用的返回值彼此不同。
我们是否有办法通过使用system(COMMAND)
函数的返回值来检测细分错误或异常终止?
例如,当我使用system
函数执行命令后出现分段错误时,我确认该函数的返回值是35584.但是,我不知道返回值的含义是什么,我是不确定所有可能的分段错误都返回35584。
当遇到分段故障或异常终止时,有没有办法检测返回值的所有可能值?
答案 0 :(得分:5)
man 3 system
引用man 2 wait
。后一页描述了几个可用于此值的宏,尤其是WIFSIGNALED(status)
和WTERMSIG(status)
。这就是您可以用来检查分段故障或终止其他信号的方法。
答案 1 :(得分:2)
#include <cstdlib>
#include <iostream>
int main()
{
const int result = system("./core_dump"); // core_dump only calls abort()
std::cout << "result=" << result << '\n';
std::cout << "Terminated by signal: " << (WIFSIGNALED(result) ? "yes" : "no") << '\n';
std::cout << "Exited normally: " << (WIFEXITED(result) ? "yes" : "no") << '\n';
return 0;
}
输出(在Ubuntu 12.10上):
Aborted (core dumped)
result=34304
Terminated by signal: no
Exited normally: yes
./core_dump
打印exited normally: yes
可能会令人惊讶。虽然./core_dump
失败,但system
会返回运行该命令的/bin/sh -c
进程的退出代码,该代码正常退出。
相反,调用system("/bin/kill -9 $$")
而不是system("./core_dump")
会导致以下输出:
result=9
Terminated by signal: yes
Exited normally: no
退出代码的另一个注释。 core_dump
示例返回退出代码34304.首先,我们必须将其移位8位。结果是35304 >> 8 == 134
,这是使用中止信号终止的作业的退出代码。如果由于段错导致失败,我们本来会得到139。
Here是指向退出代码概述的链接。
最后,这是core_dump
用于测试的源代码:
#include <cstdlib>
int main() {
abort();
return 0;
}
答案 2 :(得分:1)
此问题讨论了Linux退出代码:Are there any standard exit status codes in Linux?
编辑:观察:
接下来检查glibc源以获得权威答案......
答案 3 :(得分:0)
对于任意命令?并不是的。每个程序都可以为退出代码赋予意义。唯一可以假设的是0意味着成功,但即使这只是惯例而且也不能保证。