C++无需内存操作即可从 FIFO 读取
C++ reading from FIFO without memory operations
我想使用来自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。
不确定我是否正确,复杂 - 你的意思是最有效的,还是最混乱的?
无论如何,如果您不需要缓冲区内容 - 您可以只使用(共享)互锁变量。
相关文章:
- 理解boost::asio-async_read在无需读取内容时的行为
- 使用新行和不使用新行读取文件
- 读取文件并输入到矢量中
- 用c++从输入文件中读取另一行
- 读取文件的最后一行并输入到链接列表时出错
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 无法找到/读取配置文件.conf-FileIOException
- 如何使用Luacneneneba API正确读取字符串和表参数
- C++将文本文件中的数据读取到结构数组中
- 正在将csv文件读取为双精度矢量
- 为什么 sscanf 无法从一个字符串中读取uint64_t和字符?
- 为什么在读取文件大小时文件IO速度会发生变化
- 正在读取二进制文件(is_open)
- 如何在c++中从文本文件中逐行读取整数
- SSH通过/sbin/SSH无法读取RSA密钥文件(从控制台运行)
- 即使我读取了所有内容,在FIFO上打开的QSocketNotifier也会一直启动
- FIFO块程序,直到其他进程读取
- 在Linux中检测到从pipe/fifo的另一端读取的尝试
- C++无需内存操作即可从 FIFO 读取
- 在c++中使用fifo(阻塞读取)