Qprocess把我的linux命令搞砸了(我想).如何修复

Qprocess messes my linux command up (i think). how to fix?

本文关键字:我想 何修复 我的 linux 命令 Qprocess      更新时间:2023-10-16

我需要强制我的c++QT4应用程序从linux命令中读取结果。我正在尝试使用Qprocess,但一旦我的命令变得复杂,它就会莫名其妙地变得一团糟(只是猜测(,而且不起作用。

在这里,我试着给余举一个小例子:

QProcess process;
command = "ls -l | grep a | sort";
qDebug() << "Execute command -> "+command;
process.start( command );
process.waitForFinished(-1);
QString processStdout = process.readAllStandardOutput();
QString processStderr = process.readAllStandardError();
qDebug() << "Std out -> "+processStdout;
qDebug() << "Std err -> "+processStderr;

这将打印:

Execute command -> ls -l | grep a | sort
"Std out -> " 
"Std err -> ls: |: No such file or directory

如果从控制台运行,while将正确打印文件名。

如果我用command = "ls -l";之类的更简单的东西代替comman,它就不会平滑工作操作系统在标准错误时返回错误。

我猜,用于该命令的Qstring会以某种方式被操纵。知道发生了什么吗?

QProcess不支持shell命令。因此,管道符号不由shell进行解释,而是直接传递给lsls将其解释为文件名,并抱怨,因为显然没有名为|的文件。

您需要通过重定向QProcess对象的输入和输出流来手动设置管道。阅读文档以了解如何做到这一点。

一般来说,应该如何避免shell命令,而是依赖于Qt类和函数。当然不需要调用grepls,因为使用QRegExpQDir可以更容易地实现这一点。如果需要执行子流程,请使用::start(const QString&, const QStringList&, OpenMode)重载并将所有参数作为列表传递,以避免引用问题。

试试这个:

从QProcess运行shell并将参数传递给shell。示例:

QStringList options;
options << "-c" << "ls -l | grep a | sort";
QProcess process;
process.start("/bin/sh", options); //Use sh or another shell 

让我知道这是否有效。

command = "ls -l | grep a | sort";

实际上不是一个进程,而是由三个不同进程组成的管道:ls、grep和sort。

感谢大家的帮助。

为了做我需要的事情,我不得不使用来更改方案

std::string cmd("/sbin/ifconfig eth0");
FILE* pfd = popen(cmd.c_str(), "r");
if (pfd)
{
  while (!feof(pfd))
  {
    char buf[1024] = {0};
    if (fgets(buf, sizeof(buf), pfd) > 0)
    {
      std::cout << "buf = " << buf;    // a newline is already present
    }
  }
  pclose(pfd);
}
相关文章: