在Linux中检测system()函数的返回值的含义

时间:2013-01-08 19:02:15

标签: c++ linux signals system return-value

当我在Linux上运行的system(COMMAND)代码中使用C++函数执行命令时, system(COMMAND)的调用的返回值彼此不同。 我们是否有办法通过使用system(COMMAND)函数的返回值来检测细分错误异常终止

例如,当我使用system函数执行命令后出现分段错误时,我确认该函数的返回值是35584.但是,我不知道返回值的含义是什么,我是不确定所有可能的分段错误都返回35584。 当遇到分段故障或异常终止时,有没有办法检测返回值的所有可能值?

4 个答案:

答案 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?

IIRC system()的返回值应对应于生成的进程的退出代码,但这似乎与您的观察结果相反。奇怪。我会测试。

编辑:观察:

  1. 我可以确认你的系统()的返回值。
  2. 请注意35585 == 139&lt;&lt; 8. 139是segfaulted进程的linux退出代码
  3. 接下来检查glibc源以获得权威答案......

答案 3 :(得分:0)

对于任意命令?并不是的。每个程序都可以为退出代码赋予意义。唯一可以假设的是0意味着成功,但即使这只是惯例而且也不能保证。