C++ 检测system()函数的意义';Linux中的s返回值
当我使用Linux上运行的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。 当我遇到分段错误或异常终止时,是否有方法检测所有可能的返回值?对于任意命令?不是真的。退出代码的意义取决于每个
C++
code中的system(command)
函数执行命令时,
system(COMMAND)
调用的返回值彼此不同。
我们是否有任何方法通过使用系统(命令)
功能的返回值来检测分段故障或异常终止
例如,当我使用system
函数执行命令后出现分段错误时,我确认该函数的返回值为35584。然而,我不知道返回值的含义,并且我不确定所有可能的分段错误都返回35584。
当我遇到分段错误或异常终止时,是否有方法检测所有可能的返回值?对于任意命令?不是真的。退出代码的意义取决于每个程序。你唯一可以假定的是0表示成功,但即使是这样也只是惯例,不能保证。
man 3系统
指的是man 2等待
,以了解返回值的含义。后一页介绍了几个可使用此值的宏,特别是WIFSIGNALED(status)
和WTERMSIG(status)
。这就是您可以用来检查分段故障或其他信号终止的原因。Linux退出代码在本问题中讨论:
IIRC system()的返回值应与派生进程的退出代码相对应,但这似乎与您的观察结果背道而驰。奇怪。我会测试的
编辑:观察:
/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;
}