如何从C ++ / Qt Linux应用程序中逐行读取FIFO /命名pipe道?

如何从C ++ / Qt Linux应用程序中逐行读取FIFO /命名pipe道?

今天我可以从Qt程序的fifo中打开和读取,但是我不能让程序逐行读取数据。 Qt读取整个文件,意味着等待“发件人”closures会话。

让我们以一些shell命令为例来展示我想要的应用程序。

先创build一个fifo

mkfifo MyPipe 

然后我们可以用猫从fifo读取

 cat MyPipe 

然后我们发送一些数据与另一只猫

 cat > MyPipe 

然后开始input一些东西,每次你input它就会到达读者。 然后用Ctrl + Dclosures它,双方结束。

现在,发送者很容易用QTextStream创build,你只需要在发送时刷新。

 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库的尝试结束了,我得到的数据,但直到发件人在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(); 

我错过了什么?

它只是觉得我需要在stream或类似的东西上使用某种isReady或lineAvailable,但我找不到适合的文档中的任何东西…

/谢谢


注意

如果我用低级别的c风格去阅读一个字符,那么当我得到我寻找的风格。 但是能够做同样的Qt风格会很好。

 FILE *fp; fp=fopen("MyPipe", "r"); char c; while((c=getc(fp)) != EOF) { printf("%c",c); } fclose(fp); 

更新

当我启动一个debugging器时,程序挂在readLine()上,直到另一方closuresFIFO为止。

我确实使用“>>”

  line = in.readLine(); in >> line; 

Solutions Collecting From Web of "如何从C ++ / Qt Linux应用程序中逐行读取FIFO /命名pipe道?"

使用低级别c风格并读取一个字符。

 FILE *fp; fp=fopen("MyPipe", "r"); char c; while((c=getc(fp)) != EOF) { printf("%c",c); } fclose(fp); 

我不知道什么是不行,但你可以尝试使用strace进行调试:

 strace -o writer.log -e trace=write ./writer strace -o reader.log -e trace=read ./reader 

第一行将记录您的编写器程序所做的所有写入系统调用。 第二行以类似的方式工作。 这样你可以跟踪系统调用,并确保你的冲洗工作。

如果你看到反复的调用读取,正确的时间和数据,那么你有一个QTextStream的问题。

如果你不使用QTextStream,会直接从文件中读取什么?

 if(file.bytesAvailable()) QString line = file.readLine(); 

你可以使用这样的东西。

您可以尝试用QIODevice::Unbuffered标志打开阅读器一侧的文件。