如何从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()。 不是在他冲洗的时候,就像我用猫读书时那样。
就像这个例子:
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 流或类似的东西, 但我在文档中找不到任何适合的内容......
/感谢
注意:
如果我使用低级c风格并且在我做的时候读一个字符 得到我正在寻找的风格。 但是能够做同样的Qt风格会很好。
FILE *fp;
fp=fopen("MyPipe", "r");
char c;
while((c=getc(fp)) != EOF)
{
printf("%c",c);
}
fclose(fp);
更新:
当我启动调试器时,程序挂在readLine()上, 并且在对方关闭fifo之前不要继续。
我确实使用“&gt;&gt;”
line = in.readLine();
in >> line;
答案 0 :(得分:4)
使用低级c样式并在当时读取一个字符。
FILE *fp;
fp=fopen("MyPipe", "r");
char c;
while((c=getc(fp)) != EOF)
{
printf("%c",c);
}
fclose(fp);
答案 1 :(得分:2)
我不知道哪些不起作用,但您可以尝试使用strace调试它:
strace -o writer.log -e trace=write ./writer
strace -o reader.log -e trace=read ./reader
第一行将记录您的writer程序所做的所有write系统调用。第二行以类似的方式工作。 这样您就可以跟踪系统调用,并确保您的刷新工作正常。
如果您看到重复调用read,使用正确的时序和数据,那么QTextStream就会出现问题。
如果您不使用QTextStream,但直接从文件中读取会发生什么?
答案 2 :(得分:2)
if(file.bytesAvailable())
QString line = file.readLine();
你可以使用这样的东西。
答案 3 :(得分:1)
您可以尝试使用QIODevice::Unbuffered
标记在阅读器端打开文件。