如何使用文件实现循环缓冲区?

Bad*_*dri 6 c embedded file-io

我的应用程序(C程序)打开两个文件句柄到同一个文件(一个在写入,一个在读取模式).应用程序中的两个独立线程读取和写入文件.这很好用.由于我的应用程序在具有有限ram磁盘大小的嵌入式设备上运行,我希望写入FileHandle在达到最大大小时包装到文件的开头,并且读取FileHandle像循环缓冲区一样.我从这个问题的答案中理解这应该有效.但是,只要我fseek写入FileHandle文件的开头,就会fread返回错误.将EOF得到做重置fseek文件的开头?如果是这样,应该使用哪个函数使写入文件位置设置为0而不导致EOF重置.

编辑/更新:我尝试了几件事:


  1. 基于@neodelphi我使用管道这是有效的.但是我的用例需要我写入文件.我收到多个直播视频监控流通道,需要存储到硬盘中,并且还可以读回解码并在监视器上显示.

  2. 感谢@Clement关于做ftell的建议我修复了我的代码中的几个错误并为读者包装工作但是,读取的数据似乎是陈旧的数据,因为写入仍然被缓冲,但读者从硬盘读取过时的内容.由于性能方面的考虑,我无法避免缓冲(我需要将32Mbps的实时数据写入硬盘).我已经尝试过像刷写一样的时间,从写入包装到读取包装和读取包装后截断文件(ftruncate)的时间间隔,但这并不能解决过时的数据问题.

  3. 我试图以乒乓球方式使用两个文件,看看这是否解决了这个问题,但想知道是否有更好的解决方案

Cle*_*lot 0

你应该有类似的东西:

// Write
if(ftell(WriteHandle)>BUFFER_MAX) rewind (WriteHandle);
fwrite(WriteHandle,/* ... */);

// Read (assuming binary)
readSize = fread (buffer,1,READ_CHUNK_SIZE,ReadHandle);
if(readSize!=READ_CHUNK_SIZE){
    rewind (ReadHandle);
    if(fread (buffer+readSize,1,READ_CHUNK_SIZE-readSize,ReadHandle)!=READ_CHUNK_SIZE-readSize)
        ;// ERROR !
}
Run Code Online (Sandbox Code Playgroud)

未经测试,但它提供了一个想法。写入还应该处理BUFFER_MAX不取模的情况WRITE_CHUNK_SIZE

此外,只有在确定数据已被写入时才可以读取。但我想你已经这么做了。