4

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

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

4

4 回答 4

5

man 3 systemman 2 wait用于返回值的含义。后一页描述了几个可用于此值的宏,特别是WIFSIGNALED(status)WTERMSIG(status)。这就是您可以用来检查分段错误或其他信号终止的方法。

于 2013-01-08T19:11:14.873 回答
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。

是退出代码概述的链接。

最后,这core_dump是用于测试的源代码:

#include <cstdlib>

int main() {
  abort();
  return 0;
}
于 2013-01-08T19:22:10.647 回答
1

Linux 退出代码在这个问题中讨论:Are there any standard exit status codes in Linux?

IIRC system() 的返回值应该对应于衍生进程的退出代码,但这似乎与您的观察背道而驰。奇怪的。我会测试。

编辑:观察:

  1. 我可以确认您对 system() 的返回值。
  2. 请注意,35585 == 139 << 8. 139 是 segfaulted 进程的 linux 退出代码

接下来查看glibc源码获得权威答案...

于 2013-01-08T19:13:18.243 回答
0

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

于 2013-01-08T19:10:24.030 回答