【问题标题】:Qt QProcess startDetached can't end process (bash session)Qt QProcess startDetached 无法结束进程(bash 会话)
【发布时间】:2016-07-21 16:43:20
【问题描述】:

我正在尝试从 Qt GUI 调用 shell 脚本,但在运行脚本后,bash 会话在应该完成时保持打开状态。

拥有此代码:

QString s = "./script.sh " + argument;
qint64 *pid = NULL;
QProcess process;
process.startDetached("/bin/bash", QStringList() << "-c" << s, NULL, pid);
bool finished = process.waitForFinished(-1);
std::cout << "ended";

所以在运行脚本后,它期望输入一个命令,我可以输入任何命令,它会执行它。问题是在我输入命令之前它永远不会完成。

我也尝试像这样修改s 变量:

QString s = "./script.sh " + argument + " ;exit";

希望它会结束 bash 会话,但没有任何反应。

如果我不使用startDetached 函数,而是使用start,它会在没有;exit 命令的情况下关闭bash 会话。

希望有人知道如何解决它或解决方法!

【问题讨论】:

  • 脚本和参数是什么?或者,您可以使用标准命令(例如 bash -c "echo done"bash -c "echo done")重现此问题吗?
  • 一个标准命令将重现我想要的行为。该脚本有 2 个命令,然后是一个 exit 0 来结束脚本。命令执行正确。

标签: c++ bash qt qprocess


【解决方案1】:

startDetached() 是静态方法;您启动了一个新进程,但它没有由 process 对象表示。

当您等待process 完成时,它将永远等待,因为process 从未启动。

尝试类似:

process.start("/bin/bash", QStringList() << "-c" << s);
bool finished = process.waitForFinished(-1);

您可能希望在 start() 之前重定向 I/O。

【讨论】:

  • 另外,startDetached 的全部意义在于启动进程并将其与当前进程分离,所以等待它真的没有意义。
  • 是的,海德不是我的问题。该行用于测试目的。我的问题是如何让子进程结束,因为它卡在 bash 会话中。还尝试了 start() 方法,但我需要它是非阻塞的。
  • @deuseux,我不完全理解您要做什么:start() 不会阻止; startDetached() 创建一个非子(因此不可等待)进程。
  • @TobySpeight,所以如果在执行startDetached之后一切正常,就不用担心一遍又一遍地执行……我们不需要结束这个过程吗?
猜你喜欢
  • 2021-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-18
  • 1970-01-01
  • 2015-07-18
  • 2017-08-17
  • 1970-01-01
相关资源
最近更新 更多