【问题标题】:Detecting meaning of system() function's return value in Linux在 Linux 中检测 system() 函数返回值的含义
【发布时间】:2012-12-22 17:31:25
【问题描述】:

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

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

【问题讨论】:

  • 您可以使用较低级别的forkpipedup2closeexecvewaitpid 系统调用。然后waitpid 给出正确的状态。您还可以使用一些特定于库的函数(例如 GtkQt 都为异步进程提供函数)。

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


【解决方案1】:

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

【讨论】:

    【解决方案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 &gt;&gt; 8 == 134,这是使用中止信号终止的作业的退出代码。如果它因为段错误而失败,我们会得到 139。

    Here 是一个指向退出代码概览的链接。

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

    #include <cstdlib>
    
    int main() {
      abort();
      return 0;
    }
    

    【讨论】:

    • 因为system 返回运行该命令的/bin/sh -c 进程的退出代码,并且sh 不进行核心转储,即使该命令启动的程序执行了。
    【解决方案3】:

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

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

    编辑:观察:

    1. 我可以确认您对 system() 的返回值。
    2. 请注意,35585 == 139

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 2012-01-10
        • 1970-01-01
        • 2017-04-29
        • 2012-01-29
        • 1970-01-01
        • 1970-01-01
        • 2016-09-04
        • 2012-07-26
        • 1970-01-01
        相关资源
        最近更新 更多