2017-07-19 137 views
-3

我有一个为我正在开发的基于Qt的C++应用程序开发小型依赖关系管理器的需求。这个C++应用程序将针对Linux系统。所以这就是它的工作原理。我通过system()函数执行一个shell脚本。在shell脚本中,我检查是否安装了所需的软件包,如果没有,请使用上次执行的命令的状态退出shell脚本。我的问题是,我们如何在C++中捕获并处理它? (我想捕捉它,所以我可以告诉,一些依赖关系都没有安装的用户,并寻求用户权限来安装它们)在C++中捕获shell脚本退出状态

C++代码:

system("./myscript.sh"); 

shell代码:

iwconfig 
exit $? 

我已经试过这种形式给出早些时候:

用C

++:

int i = system("./myscript.sh"); 
if(i!=0) 
QMessageBox::information(this, tr("test"), tr("program exited with exit code"+i)); 

但后来我得到以下错误: 劣势停止,因为它从操作系统收到信号。信号名称:SIGSEGV信号含义:分割故障

如何完成?

原型
+0

QtCreator在出现错误时显示什么? –

+0

如果您使用退出代码退出程序+ std :: to_string(i)'',它会更好吗? –

回答

1

system命令是:

int system(const char *command); 

它返回命令的退出代码,它执行(在您的示例外壳脚本)。所以你只需使用:

int status = system("./myscript.sh"); 
+0

这对于如何解释返回码有一些有用的链接:http://en.cppreference。com/w/cpp/utility/program/system –

+0

@ikleschenkov我试过,它给了我下面的错误:劣势停止,因为它从操作系统收到信号。 信号名称: SIGSEGV 信号含义: 分割故障 –

0

我开发一个基于Qt的C++应用程序我开发一个小的依赖管理的要求。

您应该考虑而不是使你的(或部分公共)分配一个适当的package(例如,一些.deb file为Debian或Ubuntu),因为包管理器做这个工作(移交依赖关系管理),比你可以合理地更好。


system(3)返回代码实际上是waitpid(2)给出的状态代码。阅读关于bash和贝壳的exit status。因此,如果最后执行的命令(通过/bin/sh -csystem(3)启动)与SIGSEGV崩溃(见signal(7) ......),你可以使用WIFSIGNALED然后WTERMSIG

我想,一些方案由您./myscript.sh坠毁经营不善。

您可能会考虑在脚本中使用shell trap builtin来处理该问题。