我的应用程序(C程序)打开两个文件句柄到相同的文件(一个在写入,一个在读取模式)。应用程序中的两个独立线程读取和写入文件。这工作正常。 因为我的应用程序具有有限的RAM磁盘大小的嵌入式设备上运行,我想写FileHandle
包文件的开头部分就达到最大尺寸和阅读FileHandle
遵循类似的循环缓冲区。我从对this question的回答中了解到这应该起作用。但是只要我做的fseek
写FileHandle
文件的开头,fread
返回错误。将EOF
复位到fseek
开始文件?如果是这样,应该使用哪个函数来使写入文件位置被设置为0,而不会导致EOF
被重置。如何使用文件实现循环缓冲区?
编辑/ UPDATE: 我试过几件事情:
基于@neodelphi我用这个管道工程。但是,我的用例需要我写入一个文件。我收到多个实时视频监控流的频道,需要将它们存储到硬盘中,并且还读回解码并显示在显示器上。
感谢@Clement关于做fll的建议我在代码中修复了一些bug,并为阅读器打包工作,但是,由于写入仍然被缓存,读取的数据似乎是陈旧的数据,但读取器从硬盘读取陈旧的内容磁盘。由于性能方面的考虑,我不能避免缓冲(我得到需要写入硬盘的32Mbps的实时数据)。我只尝试了在写封装到读封装之间的时间间隔以及在读封装后截断文件(ftruncate)的时间间隔内刷新写入的事情,但这并不能解决陈旧的数据问题。
我试图使用乒乓时尚的两个文件,看看是否能解决问题,但想知道是否有更好的解决办法
你是否锁定,而读写文件? –
如果您正在开发一个类似linux的系统,您是否尝试过使用管道文件?这些类型的文件只存储已写入但未读取的内容,因此可能不需要实现循环缓冲区。 – neodelphi
@Clement。我没有任何锁。我使用std C lib fread和fwrite调用 – Badri