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

4

我已经阅读了一些与此相关的问题(在这里),但我仍然有些困惑。

我的理解是,写入系统调用将数据放入缓存缓存(在那个问题中被称为操作系统缓存)。当缓存缓存装满时,它会被写入磁盘。

缓冲IO是在此基础上的进一步优化。它使用C RTL缓冲区进行缓存,当它们装满时,发出write系统调用将内容移动到缓存缓存。如果我使用fflush,则与该特定文件相关的数据也将被发送到C RTL缓冲区缓存缓存中的磁盘。

我的理解正确吗?


根据操作系统、文件打开模式和特定于系统的每个文件句柄设置而定... - Mat
1个回答

3
根据您所使用的标准C库,stdio缓冲区的刷新方式各不相同。引用自Linux手册页
注意,fflush()仅刷新由C库提供的用户空间缓冲区。为确保数据物理存储在磁盘上,还必须刷新内核缓冲区,例如通过sync(2)或fsync(2)。
这意味着,在Linux系统上,使用fflush或溢出缓冲区将调用write函数。但操作系统可能会保留内部缓冲区,而实际上并没有将数据写入设备。为确保数据真正写入设备,请同时使用fflush和低级别的fsync。

@JP:我的意思是,printf最终会导致write系统调用。 - FourOfAKind
@Lamia:我重新表达了我的答案。 - Some programmer dude

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接