写系统调用直接将数据写入磁盘?

时间:2011-12-07 14:29:01

标签: c io filesystems operating-system

我已经阅读了几个与此相关的问题(here),但我仍然有些困惑。

我的理解是写入系统调用将数据放入Buffered Cache(该问题中提到的OS缓存)。当Buffered Cache变满时,它会被写入磁盘。

缓冲IO在此基础上进一步优化。它会在C RTL buffers中进行缓存,当它们发出完整的write系统调用时,会将内容移至Buffered Cache。如果我使用fflush,则会将C RTL buffers以及Buffered Cache中与此特定文件相关的数据发送到磁盘。

我的理解是否正确?

1 个答案:

答案 0 :(得分:3)

如何刷新stdio缓冲区取决于您使用的标准C库。引用Linux manual page

  

请注意,fflush()仅刷新C库提供的用户空间缓冲区。   为了确保数据物理存储在磁盘上,内核缓冲区必须是   也刷新,例如,使用sync(2)或fsync(2)。

这意味着在Linux系统上,使用fflush或溢出缓冲区将调用write函数。但是操作系统可能会保留内部缓冲区,而不是实际将数据写入设备。要确保数据真正写入设备,请同时使用fflush和低级fsync

编辑:回答改编。​​