Qt QProcess startDetached 无法结束进程(bash 会话)

Posted

技术标签:

【中文标题】Qt QProcess startDetached 无法结束进程(bash 会话)【英文标题】:Qt QProcess startDetached can't end process (bash session) 【发布时间】: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 来结束脚本。命令执行正确。 【参考方案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之后一切正常,就不用担心一遍又一遍地执行……我们不需要结束这个过程吗?

以上是关于Qt QProcess startDetached 无法结束进程(bash 会话)的主要内容,如果未能解决你的问题,请参考以下文章

QProcess::startDetached shell 在父进程死亡时被杀死,如果父进程是一个 systemd 服务

如何结合使用 QProcess::startDetached() 和 setStandardOutputFile()

即使进程终止,waitpid 总是返回 -1

QT调用外部程序

PyQt4 QProcess.startDetached() - 无法获得衍生进程的返回值和 PID

QProcess::startDetached(5.10有了一种新的方式)