进程结束后,如何保持QProcess执行的命令?

时间:2018-08-30 00:43:42

标签: 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程序终止后在运行GUI程序的终端中执行myProg程序。

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

是否可以保留环境变量?或者,是否可以使用以下myProg进程的环境变量在其他进程中执行mproc程序?

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

1 个答案:

答案 0 :(得分:2)

您使用的documentation的重载是静态方法,因此它不会考虑特定实例的属性,即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::startDetached。只是您必须使用非静态方法来设置流程环境。您可以使用QProcess::setProcessEnvironment获取当前进程的环境变量。

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启动时以某种方式跟踪所有创建的进程。