c++ - 如何在进程结束时保持 QProcess 执行的命令?

标签 c++ qt environment-variables qprocess

我试图找到一种方法,在 Linux 系统中 GUI 程序终止后,让 QProcess 继续执行命令。现在,当进程结束时,所有执行的命令都消失了。有没有办法在 QProcess 终止后保留它?

// code which executes command in linux
QProcess *mproc = new Qprocess(this);
QStringList args;
mproc->setWorkingDirectory("/home/test");
args << "-c" << "source tool_def1.env; source tool_def2.env; myProg";
mproc->start("/bin/csh", args);

tool_def1.envtool_def2.env 文件包含一些用于执行myProg 的环境变量,如set path = ( ~~~~).

在 GUI 程序中,这段代码做得很好。而且,我想在 GUI 程序终止后运行的终端中执行 myProg 程序。

但是,如果 GUI 程序终止,我无法运行 myProg,因为 tool_def1.envtool_def2.env 的环境变量文件消失了。

是否可以保留环境变量?或者,是否可以通过mproc进程的环境变量在其他进程中执行myProg程序,如下所示?

QProcess *mproc2 = new QProcess(this);
mproc2->setWorkingDirectory("/home/test2");
mproc2->start("myProg");

最佳答案

QProcess::startDetached 的过载您使用的是静态方法,因此它不会考虑特定实例的属性,即 mproc->setWorkingDirectory("/home/test") 没有为静态方法,仅适用于 mproc。当您启动该进程时,由于未为静态调用设置工作目录,因此无法找到该程序并失败。

如您在文档中所见,静态startDetached 也接受工作目录作为参数,因此您可以将代码更改为:

QStringList args;
args << "-c" << "source tool_def1.env; source tool_def2.env; myProg";
QProcess::startDetached("/bin/csh", args, "/home/test");

另一种方式是使用非静态版本,需要单独指定程序:

QProcess mproc(this);

QStringList args;
args << "-c" << "source tool_def1.env; source tool_def2.env; myProg";
mproc.setArguments(args);

mproc.setWorkingDirectory("/home/test");
mproc.setProgram("/bin/csh");

qint64 pid; // to store the process ID (will become invalid if the child process exits)
mproc.startDeatached(&pid);

关于你的第二个问题,看看QProcess::setProcessEnvironment .只是您必须使用非静态方式来设置进程的环境。您可以使用 QProcess::systemEnvironment 获取当前进程的环境变量.

mproc.setProcessEnvironment(QProcess::systemEnvironment());

根据评论更新:如果你想在 GUI 应用程序运行时始终使用激活的环境变量(它是某种配置器吗?)你可以将它们保存到一个文件(例如 JSON),然后加载和从第二个过程中手动设置它们。

要提取它们,您可以执行以下操作:

const auto env_vars = QProcess::systemEnvironment().toStringList();

现在 env_vars 将是格式为 NAME_OF_ENVAR=VALUE_OF_ENVAR 的字符串列表。您可以将此类列表保存到文件中(您需要在每行的开头添加一个 export 以便与 source 一起使用)。


我已经在 Windows(VS 15.8.2 和 Qt 5.10.0)中测试了静态版本,它按预期工作。使用的代码:

#include <qprocess.h>

int main(int argc, char* argv[])
{
  QProcess::startDetached("cmd", QStringList() << "/c" << "test.exe", "../test/");

  return 0;
}

test.exe 的代码基本上是一个永无止境的过程。


注意:一个有趣的事实,作为使用 VS 的开发人员的注意事项。对于相同的程序和构建,如果它是从命令行执行的,它会正常工作:应用程序结束,第二个进程继续在后台运行,但如果从 VS IDE 执行,则控制台窗口保持活着,如果我关闭它,第二个进程也会被杀死。调试时,调试器结束但控制台仍显示。我想这是因为 VS 在从 IDE 启动时以某种方式跟踪所有创建的进程。

关于c++ - 如何在进程结束时保持 QProcess 执行的命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52087809/

相关文章:

c++ - 使用基类而不是基指针来处理派生类

c++ - 访问与某个位置直接相邻的多维数组中的所有位置?

QTableView + QSqlTableModel - 如何读取所选行的 id

c++ - QThread 与 QTimer 和 QSerial - 育儿

ubuntu - 无法在 Ubuntu 中设置 flutter 环境变量

linux - "find a command in a path"是什么意思?

c++ - 在 MPI 中跟踪全局索引

c++ - 线程 : How to calculate precisely the execution time of an algorithm (duration of function) in C or C++?

qt - 如何从 QML 绑定(bind)到根上下文对象信号

spring - 如何在 Spring Boot 项目中将 application.properties 中的环境属性获取到 logback.groovy 中?