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

10 浏览
0 Comments

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

我读了一些相关问题(here),但仍然有些困惑。

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

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

我的理解正确吗?

0
0 Comments

在使用标准C库时,stdio缓冲区的刷新方式取决于所使用的标准C库。根据Linux手册页的引用:

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

这意味着在Linux系统上,使用fflush或溢出缓冲区将调用write函数。但操作系统可能保留内部缓冲区,并没有实际将数据写入设备。为了确保数据真正写入设备,需要同时使用fflush和底层的fsync函数。

编辑:回答重新表述。

在我之前的回答中,我混淆了它们的含义,即printf最终会导致write系统调用。

我重新表述了我的回答。

0