C++ 当进程结束时,如何保持QProcess执行的命令?

C++ 当进程结束时,如何保持QProcess执行的命令?,c++,qt,environment-variables,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" &

我试图找到一种方法,在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);
您正在使用的重载是一个静态方法,因此它不会考虑特定实例的属性,即,
mproc->setWorkingDirectory(“/home/test”)
不会为静态方法设置工作目录,只为
mproc
。启动进程时,由于没有为静态调用设置工作目录,因此无法找到程序,程序将失败

正如您在文档中看到的,static
startDetached
也允许工作目录作为参数,因此您可以将代码更改为:

QStringList args;
args << "-c" << "source tool_def1.env; source tool_def2.env; myProg";
QProcess::startDetached("/bin/csh", args, "/home/test");
从注释更新:如果您希望在GUI应用程序运行时始终使用活动的环境变量(是某种配置程序吗?),您可以将它们保存到一个文件(例如JSON),然后从第二个进程手动加载和设置它们

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

const auto env_vars = QProcess::systemEnvironment().toStringList();
现在
env\u vars
将是一个字符串列表,格式为
NAME\u of_ENVAR=VALUE\u of_ENVAR
。您可以将此类列表保存到文件中(您需要在每行开头预先添加一个
导出
,以便与
源代码
一起使用)


我已经在Windows(VS15.8.2和Qt5.10.0)中测试了静态版本,它按照预期工作。使用的代码:

#include <qprocess.h>

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

  return 0;
}
#包括
int main(int argc,char*argv[])
{

QProcess::StartDetailed(“cmd”,QStringList())谢谢你,scopchanov。我尝试过使用startDetached,但效果不好。在我的GUI程序中,效果很好。但是,当GUI程序运行或终止时,终端中还找不到“myProg”。此外,“mproc2”进程也不起作用。我在代码中只将“start”改为“startDetached”。对吗?向chec提出几个问题k:您确定返回的startDetached是真的吗?您检查返回的PID了吗?您确定它一直在运行吗?(可能写一些日志文件,您可以检查)我检查了startDetached的返回是否正确,“myProg”是否正常工作。但是,在我关闭GUI程序和“myProg”后,当我在终端的shell提示符中再次执行myProg时,myProg不工作,并显示“command not found”消息。谢谢。但我的问题尚未解决。我想在GUI Pro之后再次执行“myProg”程序gram被关闭,不是为了继续运行在运行GUI程序期间执行的“myProg”程序。在GUI程序和“myProg”都终止后,我希望在输入“myProg”(执行命令)时再次执行“myProg”在终端窗口的shell提示符中。所以我想在GUI程序终止后保留环境变量。有可能吗?我不明白:您想执行myProg,但在GUI结束时关闭它,然后从shell手动恢复它,但使用GUI执行期间存在的环境变量?在这种情况下,只需保存hem到一个文件(JSON、XML、INI…),并在从shell执行时重新加载它们。例如,在GUI中,您可以添加一个命令行参数,以指示必须存储EV,如果省略了EV(从CLI中)然后从文件中加载它们。这就是你想要的吗?是的!!但是,我不太了解JSON、XML、INI、CLI…是否可以在GUI程序中将环境变量应用到终端???使用任何你想写/读的文件格式,它们只是示例(尽管我鼓励你学习它们,因为它们非常有用)…CLI代表:命令行界面(shell)该文件已存在,用于应用环境变量。(tool_def1.env/tool_def2.env),并且,我还可以通过在终端中键入“source”来运行“myProg”。但是,我希望在应用到GUI程序后重新使用相同的变量,而不是再次寻找它们的来源。是否可能?
mproc.setProcessEnvironment(QProcess::systemEnvironment());
const auto env_vars = QProcess::systemEnvironment().toStringList();
#include <qprocess.h>

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

  return 0;
}