【fsync和fflush的关系和不同】
参考: https://blog.csdn.net/bingcheby/article/details/105319661
读/写/fsync与fread/fwrite/fflush的关系和不同
读/写/fsync :
linux的基本操作
内核调用与进程上下文切换(从用户状态到核心状态的转换)相关联,会消耗性能
fread/fwrite/fflush :
C语言标准规定的IO流操作构建在读/写/fsync的基础上
用户层添加了缓冲区机制以减少内核调用的次数,但添加了一次内存副本。
补充:
对于输入设备,调用fsync/fflush会清空相应的缓冲区并丢弃内存数据。
对于输出设备/磁盘文件,fflush只能确保数据到达内核缓冲区,而不能确保数据到达物理设备。
因此,在调用fflush后,必须调用fsync(fileno ) stream ),以便将数据保存到磁盘。
【fflush函数和fsync函数的比较】
flush (文件*;
fflush是参数FILE *
fflush是libc.a提供的一种方法,用于将未写入流的数据传输到内核。
如果参数为null,则发生所有流溢出。
fsync(intFD );
fsync接受int类型的文件描述符。
fsync是系统提供的系统调用。 将数据写入光盘。
fflush:
调用write ()将C库中的缓存写入磁盘[实际上是写入内核缓冲区]。
fsync :
将内核缓冲区刷到磁盘。
C库缓冲区----fflush----->内核缓冲区------fsync--->磁盘
【sync ()、fflush ()、fsync ) )的差异】
用途不同:
sync,同步整个系统的磁盘数据。
fsync,将打开的文件与缓冲区数据同步发送到磁盘。
fflush,更新打开的流。
同步级别不同:
sync,将缓冲区数据写回磁盘,保持同步。(无参数)
fsync,将缓冲区数据写入文件。(有参数int fd ) ) ) )。
fflush,立即导出文件流中未写入的数据
//=======================================================================================
这个博客解决了我的问题:
APP应用程序每10ms fwrite写入一次fwrite,最后fclose也成功后,读取此文件时发现问题:已部分写入/完全未写入
解决方案:
降低fwrite频率(增加在程序中存储数据的缓冲器),fwrite结束后,进行fflush,进行fsync
还有fclose。