我想使用C ++代码中的FIFO缓冲区。 有两个进程,其中一个总是写入FIFO,另一个总是读取它。这很简单。
我真的不需要读取缓冲区的内容,我只想知道其中有多少数据,并清除它。
C ++中最复杂的解决方案是什么?
此代码运行良好,但我从不需要缓冲区的内容:
int num;
char buffer[32];
num = read(FIFO, buffer, sizeof(buffer));
//num is the important variable
谢谢!
答案 0 :(得分:0)
你可以看一下这个问题:Determing the number of bytes ready to be recv()'d
在Linux上,套接字的代码也应该在FIFO上花费很少的工作量。但是Windows,我不确定。
答案 1 :(得分:0)
据我所知,清除linux FIFO中的字节(不破坏FIFO)的唯一方法就是将它们读出来。您可以通过一次读取大量数据来更快地清除它们(32
是一个非常小的读取大小,除非这是通常写入FIFO的大小)。如果您处于阻止模式,那么您应该查询Robert Mason指示的链接中描述的字节。如果描述符处于非阻塞模式,则可以读取,直到返回EAGAIN
以确定它已被清除。您可以使用poll
来确定何时有更多数据到达FIFO。
答案 2 :(得分:0)
清除管道的唯一方法是读取它,因此存在多少字节的问题没有实际意义 - 在阅读之后你就会知道。真正的问题最终与任何阅读相同:
(1)如果您不关心数据,那么可能您不想阻止等待它,因此请使FIFO无阻塞。
(2)由于你可能不想坐下来浪费时间轮询FIFO来查看是否有东西要读,你应该把FIFO fd放在select
语句中。当有东西需要阅读时,将其排干并添加到计数器中。
答案 3 :(得分:-1)
不确定我是否正确,复杂 - 你的意思是效率最高还是最混淆?
无论如何,如果你不需要缓冲内容 - 你可以只使用(共享)互锁变量。