在数据写入磁盘之前,fwrite 会阻塞吗?

Does fwrite block until data has been written to disk?

本文关键字:fwrite 数据 磁盘      更新时间:2023-10-16

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

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

我对这种特殊情况下 Windows 10 上的行为感到好奇。

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

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

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

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

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

FILE_FLAG_NO_BUFFERING0x20000000

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

成功处理文件有严格的要求 使用 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

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

不。 事实上,它甚至(不一定(等到数据被移交给操作系统——fwrite 可能只是将数据放在其内部缓冲区中并立即返回,而无需实际写入任何内容。

要强制数据到操作系统,您需要在FILE指针上使用fflush(fp),但这仍然不一定将数据写入磁盘,尽管它通常会将其排队等待写入。 但它不会等待那些排队的写入完成。

因此,为了保证数据写入磁盘,您需要执行操作系统级别的调用以等待排队的写入完成。 在POSIX系统(如Linux(上,这是fsync(fileno(fp))。 您需要研究Windows文档,以弄清楚如何在Windows上执行等效操作。