flush、write()与fflush()的实际差异是什么?fflush()与write()是否等同?
关于flush、
write()与fflush()的差异解析 首先明确:fflush()和write()完全不是一回事,下面拆解三者的核心差异:
1. 广义的Flush(刷新)
这是一个通用概念,核心是「把临时存储的内容同步到持久化介质」,这个过程可能涉及多个环节:
- 比如应用自己的内存缓存(比如数据库的查询缓存)刷到标准库缓冲区
- 标准库缓冲区刷到内核缓冲区
- 内核缓冲区刷到磁盘/硬件设备
只要是从「临时缓存」到「永久存储」的同步动作,都可以被称为flush。
2. write() 系统调用
这是操作系统提供的底层调用,作用是把用户态内存里的数据直接拷贝到内核的IO缓冲区。注意:
- 调用
write()成功后,数据只是进入了内核管理的缓冲区,并没有真正写到硬件设备上 - 内核会根据自身的调度策略(比如缓冲区满了、超时),自动把内核缓冲区的内容刷到磁盘
- 如果要强制内核把数据写到硬件,需要搭配
fsync()/fdatasync()这类系统调用
3. fflush() 标准库函数
这是C标准库提供的工具,仅针对标准库维护的用户态缓冲区(比如用printf、fwrite等库函数写入的内容,会先存在这个缓冲区里):
- 它的唯一作用是:把标准库用户态缓冲区里的内容,通过
write()系统调用转移到内核缓冲区 fflush()本身不会触发内核把数据刷到硬件,它只解决「应用层缓存到内核缓存」的同步问题- 比如你用
printf("test")但没加换行,stdout默认是行缓冲,内容会留在标准库缓冲区,调用fflush(stdout)才会把内容推到内核缓冲区
三者核心差异对比
- 层级不同:
fflush()属于应用层,处理标准库的用户态缓存write()属于系统调用层,处理用户态内存到内核缓存的拷贝- 广义flush是整个同步流程的统称,覆盖从应用缓存到硬件的全链路
- 作用范围不同:
fflush()仅对FILE指针对应的标准库缓存有效(比如stdin/stdout/自定义文件流)write()可以针对任意文件描述符,直接绕开标准库缓存操作- flush可以指代任何临时缓存到持久化介质的同步,范围最广
- 最终效果不同:
fflush()和write()完成后,数据都停在内核缓冲区,还没到硬件,断电可能丢失- 完整的flush(比如数据库的flush操作)会确保数据真正写入硬件,通常需要在
write()后再调用fsync()
内容的提问来源于stack exchange,提问作者3088 K
相关产品推荐
相关产品推荐

