我已经阅读了几个与此相关的问题(here),但我仍然有些困惑。
我的理解是写入系统调用将数据放入Buffered Cache
(该问题中提到的OS缓存)。当Buffered Cache
变满时,它会被写入磁盘。
缓冲IO在此基础上进一步优化。它会在C RTL buffers
中进行缓存,当它们发出完整的write
系统调用时,会将内容移至Buffered Cache
。如果我使用fflush
,则会将C RTL buffers
以及Buffered Cache
中与此特定文件相关的数据发送到磁盘。
我的理解是否正确?
答案 0 :(得分:3)
如何刷新stdio缓冲区取决于您使用的标准C库。引用Linux manual page:
请注意,fflush()仅刷新C库提供的用户空间缓冲区。 为了确保数据物理存储在磁盘上,内核缓冲区必须是 也刷新,例如,使用sync(2)或fsync(2)。
这意味着在Linux系统上,使用fflush
或溢出缓冲区将调用write
函数。但是操作系统可能会保留内部缓冲区,而不是实际将数据写入设备。要确保数据真正写入设备,请同时使用fflush
和低级fsync
。
编辑:回答改编。