Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 检测system()函数的意义';Linux中的s返回值_C++_Linux_Signals_System_Return Value - Fatal编程技术网

C++ 检测system()函数的意义';Linux中的s返回值

C++ 检测system()函数的意义';Linux中的s返回值,c++,linux,signals,system,return-value,C++,Linux,Signals,System,Return Value,当我使用Linux上运行的C++code中的system(command)函数执行命令时, system(COMMAND)调用的返回值彼此不同。 我们是否有任何方法通过使用系统(命令)功能的返回值来检测分段故障或异常终止 例如,当我使用system函数执行命令后出现分段错误时,我确认该函数的返回值为35584。然而,我不知道返回值的含义,并且我不确定所有可能的分段错误都返回35584。 当我遇到分段错误或异常终止时,是否有方法检测所有可能的返回值?对于任意命令?不是真的。退出代码的意义取决于每个

当我使用Linux上运行的
C++
code中的
system(command)
函数执行命令时,
system(COMMAND)
调用的返回值彼此不同。 我们是否有任何方法通过使用
系统(命令)
功能的返回值来检测分段故障异常终止

例如,当我使用
system
函数执行命令后出现分段错误时,我确认该函数的返回值为35584。然而,我不知道返回值的含义,并且我不确定所有可能的分段错误都返回35584。
当我遇到分段错误或异常终止时,是否有方法检测所有可能的返回值?

对于任意命令?不是真的。退出代码的意义取决于每个程序。你唯一可以假定的是0表示成功,但即使是这样也只是惯例,不能保证。

man 3系统
指的是
man 2等待
,以了解返回值的含义。后一页介绍了几个可使用此值的宏,特别是
WIFSIGNALED(status)
WTERMSIG(status)
。这就是您可以用来检查分段故障或其他信号终止的原因。

Linux退出代码在本问题中讨论:

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

编辑:观察:

  • 我可以确认system()的返回值
  • 请注意,35585==139 可能令人惊讶的是,
    /core\u dump
    打印正常退出的
    :yes
    。尽管
    /core\u dump
    失败,
    系统
    返回运行该命令的
    /bin/sh-c
    进程的退出代码,该进程正常退出

    相反,调用
    system(“/bin/kill-9$$”
    而不是
    system(“/core\u dump”)
    会产生以下输出:

    result=9
    Terminated by signal: yes
    Exited normally: no
    
    关于退出代码的进一步说明。
    core\u dump
    示例返回退出代码34304。首先,我们必须将其移位8位。结果是
    35304>>8==134
    ,这是使用中止信号终止的作业的退出代码。如果它因为SEGFULT而失败,我们会得到139

    是指向退出代码概述的链接

    最后,这里是用于测试的
    core\u dump
    的源代码:

    #include <cstdlib>
    
    int main() {
      abort();
      return 0;
    }
    
    #包括
    int main(){
    中止();
    返回0;
    }
    
    因为
    系统
    返回运行该命令的
    /bin/sh-c
    进程的退出代码,并且该
    sh
    不会进行内核转储,即使由该命令启动的程序进行了内核转储。您可以使用较低级别的
    fork
    管道
    dup2
    关闭
    执行
    waitpid
    syscalls。然后,
    waitpid
    给出正确的状态。您还可以使用一些特定于库的函数(例如
    Gtk
    Qt
    为异步进程提供函数)。
    result=9
    Terminated by signal: yes
    Exited normally: no
    
    #include <cstdlib>
    
    int main() {
      abort();
      return 0;
    }