C++无需内存操作即可从 FIFO 读取

C++ reading from FIFO without memory operations

本文关键字:FIFO 读取 操作 内存 C++      更新时间:2023-10-16

我想使用来自C++代码的FIFO缓冲区。有两个进程,其中一个始终写入FIFO,另一个始终读取它。这很简单。

真的不需要读取缓冲区的内容,我只想知道其中有多少数据,然后清除它。

C++,对此最复杂的解决方案是什么?

这段代码运行良好,但我从不需要缓冲区的内容:

int num;
char buffer[32];
num = read(FIFO, buffer, sizeof(buffer));
//num is the important variable

谢谢!

你可以看看这个问题: 确定准备成为 recv() 的字节数

在 Linux 上,套接字代码也应该在 FIFO 上以最小的工作量工作。 不过,Windows,我不确定。

清除管道的唯一方法是读取它,因此存在多少字节的问题没有意义 - 您在阅读它们后就会知道。 真正的问题最终与任何读取相同:

(1)如果您不关心数据,那么大概您不想阻止等待它,因此使FIFO不阻塞。

(2)由于您可能不想坐下来浪费时间轮询FIFO以查看是否有要阅读的内容,因此您应该将FIFO fd放在select声明中。 当有东西要读时,将其排干并添加到计数器中。

据我所知,从 linux FIFO 中清除字节(不包括破坏 FIFO)的唯一方法是将它们读出。您可以通过一次读取大量数据来更快地清除它们(32读取大小非常小,除非这是通常写入FIFO的大小)。如果您处于阻塞模式,则应按照 Robert Mason 指示的链接中所述查询字节。如果描述符处于非阻塞模式,则可以读取直到返回EAGAIN以了解它已被清除。您可以使用poll来确定何时有更多数据到达FIFO。

不确定我是否正确,复杂 - 你的意思是最有效的,还是最混乱的?

无论如何,如果您不需要缓冲区内容 - 您可以只使用(共享)互锁变量。