qt通过qprocess运行shell命令

时间:2016-11-03 17:06:18

标签: c++ linux bash qt shell

我正在开发一个小型QT应用程序来与终端进行交互,向终端发送命令并回读打印出来的信息。

示例:使用plt.plot(x,G.T[0], label="mixed_signal") plt.plot(x,g1_fit[0], label="gaussian 1") plt.plot(x,g2_fit[0], label="gaussian 2") plt.legend()

获取所有进程的输出

问题

我能够将信息写到终端,但我不认为它在系统范围内,实际示例:

命令传递给shell解释器ps -aux

从评论中进行编辑:

我需要发送特定的完整命令,我不是在寻找缩短或替代命令,我需要一种发送如下命令的方法:"echo "pre"; ps -aux; echo "post"并读取其输出。这个例子是获取所有正在运行的chrome进程的所有pid

口译员尝试

  • ps -aux | grep chrome | tr -s " " | cut -d " " -f 2
  • sh

代码:

/bin/bash

调试信息:

当达到断点时,调试信息如下:

QProcess *proc_ovpn = new QProcess(this);
proc_ovpn->waitForFinished();
proc_ovpn->start("sh",QStringList() << "-c" << "echo \"pre\";ps -aux; echo \"post\"");
proc_ovpn->setProcessChannelMode(QProcess::MergedChannels);
QString str(proc_ovpn->readAllStandardOutput());
return str;                             <<< ======= //breakpoint here

有人建议使用上面的方法从SO上的帖子运行shell代码,再找不到它。

我很茫然,我不明白为什么运行这些命令不直接与系统交互(及其信息),

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

您需要在waitForFinished()之后使用start,而不是在

之前
proc_ovpn->start("sh",QStringList() << "-c" << "echo \"pre\";ps -aux; echo \"post\"");
proc_ovpn->waitForFinished();

请注意waitForFinished()阻塞,直到进程(由start调用)完成...

此外,您可以检查流程是否成功启动和/或waitForFinished超时

proc_ovpn->start("sh",QStringList() << "-c" << "echo \"pre\";ps -aux; echo \"post\"");

if(!proc_ovpn->waitForStarted()) //default wait time 30 sec
    qWarning() << " cannot start process ";

int waitTime = 60000 ; //60 sec
if (!proc_ovpn->waitForFinished(waitTime))
         qWarning() << "timeout .. ";