3

我需要强制我的 c++ QT4 应用程序从 linux 命令读取结果。我正在尝试使用 Qpr​​ocess,但是一旦我的命令变得复杂,它就会以某种方式变得混乱(只是猜测)并且不起作用。

在这里,我尝试为 yu 做一个小例子:

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";那么它可以顺畅地工作 操作系统会在标准错误中返回错误。

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

4

4 回答 4

7

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

您需要通过重定向 QProcess 对象的输入和输出流来手动设置管道。阅读文档以了解如何执行此操作。

一般来说应该如何避免shell命令,而依赖Qt类和函数。当然没有必要调用grepor ls,因为使用QRegExp, 和可以更轻松地完成相同的操作QDir。如果您需要执行子流程,请使用::start(const QString&, const QStringList&, OpenMode)重载并将所有参数作为列表传递以避免引用问题。

于 2011-09-29T12:15:19.943 回答
4

试试这个 :

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

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

让我知道这是否有效。

于 2011-09-29T14:04:05.757 回答
0
command = "ls -l | grep a | sort";

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

于 2011-09-29T14:20:33.267 回答
-1

感谢所有人的帮助。

为了做我需要做的事,我不得不改变方法使用:

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);
}
于 2011-09-29T14:34:07.723 回答