首页 > 解决方案 > fwrite 在数据写入磁盘之前会阻塞吗?

问题描述

fwrite()函数是在将要写入磁盘的数据移交给操作系统后返回,还是仅在数据实际物理写入磁盘后才返回?

对于我的情况,我希望这是第一种情况,因为我不想等到所有数据都物理写入磁盘。我希望另一个操作系统线程在后台传输它。

在这种特殊情况下,我很好奇 Windows 10 上的行为。

https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/fwrite

标签: c++windowsfwrite

解决方案


为了提高使用时的效率,有几个地方需要缓冲数据fwrite():C++ 运行时中的缓冲和操作系统文件系统接口中的缓冲以及实际磁盘硬件中的缓冲。

这些默认设置是延迟实际将数据物理写入磁盘,直到有刷新缓冲区的实际请求或在发出写入请求时打开适当的指示器以执行物理写入。

如果您想更改行为,fwrite()请查看setbuf()函数setbuf 重定向以及setbuff()Linux 手册页,这里是Microsoft 文档setbuf()

如果您查看底层WindowsCreateFile()函数的文档,您会看到有许多标志,其中包括是否应该进行数据缓冲的标志。

FILE_FLAG_NO_BUFFERING 0x20000000

正在打开的文件或设备没有用于数据读取和写入的系统缓存。此标志不影响硬盘缓存或内存映射文件。

使用 FILE_FLAG_NO_BUFFERING 标志成功处理使用 CreateFile 打开的文件有严格的要求,有关详细信息,请参阅文件缓冲。

并参阅Microsoft 文档主题文件缓冲

在一个简单的示例中,应用程序将使用该标志打开一个文件进行写访问,FILE_FLAG_NO_BUFFERING然后WriteFile使用应用程序中定义的数据缓冲区执行对该函数的调用。在这些情况下,此本地缓冲区实际上是此操作存在的唯一文件缓冲区。由于物理磁盘布局、文件系统存储布局和系统级文件指针位置跟踪,此写入操作将失败,除非本地定义的数据缓冲区满足某些对齐标准,这将在下一节中讨论。

看看这个关于操作系统级别设置的讨论,看起来像是 Linux https://superuser.com/questions/479379/how-long-can-file-system-writes-be-cached-with-ext4


推荐阅读