2011-12-07 42 views
4

我读过几个与此相关的问题(here),但我仍然有些困惑。写系统调用直接写数据到磁盘?

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

缓冲IO在此之上进一步优化。它在C RTL buffers缓存,当他们得到完整的write系统调用发出将内容移动到Buffered Cache。如果我使用fflush,那么与存在于C RTL buffers以及Buffered Cache中的此特定文件有关的数据将被发送到磁盘。

我的理解是否正确?

+0

取决于操作系统,文件打开模式,系统特定的每个文件句柄设置... – Mat

回答

3

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

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

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

编辑:答复改写。

+0

@JP:我把它们混合在一起,意思是printf最终导致写入系统调用 – FourOfAKind

+0

@Lamia:我改写了我的回答。 –