在c ++中捕获shell脚本退出状态[重复]

Posted

技术标签:

【中文标题】在c ++中捕获shell脚本退出状态[重复]【英文标题】:Capturing shell script exit status in c++ [duplicate] 【发布时间】:2017-07-19 16:45:52 【问题描述】:

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

C++ 代码:

system("./myscript.sh");

外壳代码:

iwconfig
exit $?

我之前尝试过这种方法:

在 C++ 中:

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

然后我收到以下错误: 下级停止了,因为它收到了来自操作系统的信号。信号名称:SIGSEGV 信号含义:分段错误

如何完成?

【问题讨论】:

出现该错误时 QtCreator 会显示哪一行? 如果你做"program exited with exit code "+std::to_string(i)会更好吗? 【参考方案1】:

system 命令的原型是:

int system(const char *command);

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

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

【讨论】:

这有一些关于如何解释返回码的有用链接:en.cppreference.com/w/cpp/utility/program/system @ikleschenkov 我试过它给了我以下错误:下级停止了,因为它收到了来自操作系统的信号。信号名称:SIGSEGV 信号含义:分段错误【参考方案2】:

我需要为我正在开发的基于 Qt 的 C++ 应用程序开发一个小型依赖管理器。

您应该考虑为您的(或一些常见的)发行版(例如一些 .deb file 用于 Debian 或 Ubuntu)制作一个合适的 package,因为包管理器比您合理地做得更好(处理依赖管理)。


system(3)的返回码其实就是waitpid(2)给出的状态码。阅读 bash 和 shell 的 exit status。因此,如果执行的最后一个命令(由system(3) 启动的/bin/sh -c)以SIGSEGV 崩溃(请参阅signal(7)...),您可以使用WIFSIGNALED 然后WTERMSIG

我猜你的./myscript.sh 运行的某些程序严重崩溃了。

您可以考虑在脚本中使用 shell trap builtin 来处理它。

【讨论】:

以上是关于在c ++中捕获shell脚本退出状态[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Shell脚本curl在stderr上输出进度[重复]

源 shell 脚本的退出代码

如何获取在 shell 脚本中运行的 R 脚本的退出状态

如何在 shell 脚本中捕获 Gradle 退出代码?

如何在perl脚本中忽略shell命令的退出状态

在 C 程序中获取 shell 脚本的退出代码