1

在 Linux 中,如果我运行此命令

zcat bigFile | head

然后zcat不会解压缩所有的bigFile,只解压缩它需要的量,以便提供head它需要的数据。

但是这个呢

QProcess *process = new QProcess(this);
process->start("zcat bigFile");
process->readLine();
QTimer::singleShot(10000, process, SLOT(terminate()));

运行的zcat命令是否process只会解压缩所需的任何内容readLine()?还是会持续zcat bigFile10 秒?

是否可以使用QProcess类似于 Linux pipe的 a |,因此只能zcat使用所需的行数?

4

2 回答 2

1

在进程中运行的zcat命令是否只会解压缩所需的任何内容readLine()

还是会持续zcat bigFile10 秒?

是的

为了验证这一点,我编写了以下代码

QProcess *process = new QProcess(this);
process->start("yes");

connect(process, SIGNAL(finished(int)), this, SLOT(_end()));
connect(process, SIGNAL(error(QProcess::ProcessError)), this, SLOT(_end()));

QByteArray byteArray = process->readLine(5);
QString line = QString(byteArray);

process->closeReadChannel(QProcess::StandardOutput);

QTimer::singleShot(5000, process, SLOT(terminate()));

这基本上启动了yes连续输出这个的命令

y
y
y
y
... (and so on)

然后从 的输出中只读取一行yes,然后在 5 秒后终止进程。

我边看边运行这个命令top,结果是 5 秒yes占用 100% CPU,之后退出。这清楚地表明,yes不只是打印出一行然后停止或退出。

即使关闭stdout读取通道(忽略 的其余输出yes)仍然不会暂停yes执行。

您可以尝试定期暂停QProcess直到您有足够的时间来处理缓冲区,但这可能会变得混乱。

于 2013-08-06T19:37:59.173 回答
1

当您在 QProcess 上调用 start() 时,它会执行 zcat 程序,就像在终端中一样。这是一个独立于您的 Qt 程序的进程,因此它可以独立于您的 Qt 应用程序自由运行,或者在您提供的代码的情况下,它将一直运行到 10 秒后终止。

您是否选择让您的应用程序从 zcat 读取输出取决于您,但它仍会继续运行。

另请注意,之后直接调用 process->readline() 可能不是处理该过程的最佳方式,因为您的程序可能会在任何数据准备好之前尝试读取输出流。相反,您应该在 readline() 之前调用 waitForReadyRead(),或者将插槽连接到 QProcess 的 readyRead() 信号并从该插槽调用 readline。

----已编辑-----基于对问题的更改:-

我认为您错过了 pipe 命令的重点。据我了解,所有文件都将由 zcat 解压缩,但其输出被重定向到 head 命令。head 命令仅显示文件的前几行,这就是您只看到第一部分的原因。

这就像拥有一个文件 test.txt 并调用命令:-

cat test.txt | head

整个文件都存在,但 head 只会显示前几行。

于 2013-08-07T07:57:16.420 回答