在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脚本退出状态[重复]的主要内容,如果未能解决你的问题,请参考以下文章