【发布时间】:2010-10-05 08:21:02
【问题描述】:
如何从 C++/Qt Linux 应用程序中逐行读取 FIFO/命名管道?
今天我可以从 Qt 程序中打开并读取 fifo, 但我无法让程序逐行读取数据。 Qt 读取整个文件,这意味着他一直等到“发送者”关闭他的会话。
让我们举个例子,用一些 shell 命令来展示我想让应用程序做什么。
首先创建一个fifo
mkfifo MyPipe
那么我们就可以用cat来读取fifo了
cat MyPipe
然后我们用另一只猫发送一些数据
cat > MyPipe
然后开始输入一些东西,每次你按回车键都会到达阅读器。 然后当你用 Ctrl+D 关闭它时,两边都结束。
现在可以使用 QTextStream 轻松创建发送者, 您只需要在要发送时刷新即可。
QFile file("MyPipe");
if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
return;
QTextStream out(&file);
for(int i=0; i<3; i++) {
out << "Hello...: " << i << "\n";
out.flush();
sleep(2);
}
file.close();
但是写一个逐行阅读的小读者是我现在卡住的地方, 我对 Qt lib 的所有尝试最终都得到了数据,但是 直到发件人在 fifo 上使用 file.close()。 不是在他冲洗时,就像我使用 cat 阅读时那样。
像这个例子:
QFile file("MyPipe");
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
return 0;
QTextStream in(&file);
QString line;
do {
line = in.readLine();
qDebug() << line;
} while (!in.atEnd());
file.close();
我错过了什么?
感觉就像我需要使用某种 isReady 或 lineAvailable on 流或类似的东西, 但我在文档中找不到任何适合...
/谢谢
注意:
如果我使用低级 c 样式并在我这样做的时候读取一个字符 得到我正在寻找的风格。 但如果能做同样的 Qt 风格就太好了。
FILE *fp;
fp=fopen("MyPipe", "r");
char c;
while((c=getc(fp)) != EOF)
{
printf("%c",c);
}
fclose(fp);
更新:
当我启动调试器时,程序挂在 readLine() 上, 并且在对方关闭fifo之前不要继续。
我确实使用“>>”得到了同样的结果
line = in.readLine();
in >> line;
【问题讨论】:
-
会不会是管道被立即读取了,实际上是屏幕输出被缓冲了?你使用了
qDebug() << line;,我没有看到任何冲洗。 -
好点,没想到。
标签: c++ linux qt named-pipes fifo