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()