写系统调用直接将数据写入磁盘?
Posted
技术标签:
【中文标题】写系统调用直接将数据写入磁盘?【英文标题】:Write system call writes data to disk directly? 【发布时间】:2012-01-15 01:27:12 【问题描述】:我已经阅读了几个与此相关的问题 (here),但我仍然有些困惑。
我的理解是 write 系统调用将数据放入Buffered Cache
(该问题中提到的操作系统缓存)。当Buffered Cache
已满时,它会被写入磁盘。
Buffered IO 在此基础上进一步优化。它缓存在C RTL buffers
中,当它们满时发出write
系统调用以将内容移动到Buffered Cache
。如果我使用fflush
,则与存在于C RTL buffers
和Buffered Cache
中的特定文件相关的数据将发送到磁盘。
我的理解正确吗?
【问题讨论】:
取决于操作系统、文件打开模式、系统特定的每个文件句柄设置... 【参考方案1】:如何刷新 stdio 缓冲区取决于您使用的标准 C 库。引用Linux manual page:
请注意,fflush() 仅刷新 C 库提供的用户空间缓冲区。 为了确保数据物理存储在磁盘上,内核缓冲区必须是 也刷新了,例如,使用 sync(2) 或 fsync(2)。
这意味着在 Linux 系统上,使用fflush
或溢出缓冲区将调用write
函数。但是操作系统可能会保留内部缓冲区,而不是实际将数据写入设备。为确保数据真正写入设备,请同时使用fflush
和低级fsync
。
编辑:改写答案。
【讨论】:
@JP:我将它们混合在一起,因为 printf 最终会导致 write 系统调用 @Lamia:我改写了我的答案。以上是关于写系统调用直接将数据写入磁盘?的主要内容,如果未能解决你的问题,请参考以下文章