我试图找到一种方法,在 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.env
和tool_def2.env
文件包含一些用于执行myProg
的环境变量,如set path = ( ~~~~)
.
在 GUI 程序中,这段代码做得很好。而且,我想在 GUI 程序终止后运行的终端中执行 myProg
程序。
但是,如果 GUI 程序终止,我无法运行 myProg
,因为 tool_def1.env
和 tool_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/