【 fsync与fflush的关系和区别 】
参考: https://blog.csdn.net/bingcheby/article/details/105319661
read/write/fsync与fread/fwrite/fflush的关系和区别
read/write/fsync:
linux底层操作
内核调用, 涉及进程上下文切换,即用户态到核心态的转换,比较耗性能
fread/fwrite/fflush:
C语言标准规定的IO流操作,建立在read/write/fsync之上
在用户层,又增加了一层缓冲机制,用于减少内核调用次数,但是增加了一次内存拷贝。
补充:
对于输入设备,调用fsync/fflush将清空相应的缓冲区,其内存数据将被丢弃;
对于输出设备/磁盘文件,fflush只能保证数据到达内核缓冲区,并不能保证数据到达物理设备,
因此应该在调用fflush后,调用fsync(fileno(stream)),确保数据存入磁盘。
【fflush函数和fsync函数对比】
fflush(FILE *);
fflush接受一个参数FILE *
fflush是libc.a中提供的方法,是用来将流中未写的数据传送到内核。
如果参数为null,将导致所有流冲洗。
fsync(int fd);
fsync接受的是一个int型的文件描述符。
fsync是系统提供的系统调用。将数据写到磁盘上。
fflush:
把C库中的缓存通过调用 write() 写到磁盘[其实是写到内核缓冲区]。
fsync:
把内核缓冲刷到磁盘上。
c库缓冲-----fflush---------〉内核缓存--------fsync-----〉磁盘
【sync()、fflush()、fsync()的区别】
用途不一样:
sync, 同步整个系统的磁盘数据.
fsync, 同步打开的一个文件到缓冲区数据到磁盘上.
fflush, 刷新打开的流.
同步等级不一样:
sync, 将缓冲区数据写回磁盘, 保持同步.(无参数)
fsync, 将缓冲区的数据写到文件中.(有一个参数 int fd)
fflush, 将文件流里未写出的数据立刻写出
//=======================================
这个博客解决了我的一个问题:
应用程序每10ms fwrite 一次,fwrite写成功了,最后fclose也成功了,然后再读取这个文件发现一个问题: 写了一部分/根本没写入
解决办法:
降低fwrite的频率(增大程序中存储数据的buffer),fwrite完后,fflush一下,fsync一下
然后再fclose.