fsync与fflush的关系和区别

【 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.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值