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

标签 c++ linux qt named-pipes fifo

如何从 C++/Qt Linux 应用逐行读取 FIFO/命名管道?

现在我可以从 Qt 程序中打开和读取 fifo, 但我无法让程序逐行读取数据。 Qt 读取整个文件,这意味着他会一直等到“发送者”关闭他的 session 。

让我们以一些 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 流或类似的东西, 但我在文档中找不到任何适合...

/谢谢


注意:

如果我使用低级 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;

最佳答案

使用低级 c 风格,一次读取一个字符。

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

关于c++ - 如何从 C++/Qt Linux 应用程序逐行读取 FIFO/命名管道?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3861948/

相关文章:

c++ - 我可以在商业上使用 QT LPGL 2.1 吗?

c++ - 空终止字符串的基本原理是什么?

c++ - 封装在组合类 C++ 中

c++ - Qt Regex 帮助(数组键)

linux - 注释行出现错误 "0: command not found"

Linux。允许从网页使用扫描仪的技术?

c++ - Qt 5.3 : Accessing/returning/calling checkboxes that are created dynamically(? )

c++ - 如何使用 Qt 中的代码将小部件添加到中央小部件中

c++ - 在 C++ 文件中使用 eof()

linux - 纪元时间的位数