在将数据写入磁盘之前,fwrite是否会阻塞?

时间:2018-06-23 18:12:15

标签: c++ windows fwrite

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

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

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

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

2 个答案:

答案 0 :(得分:6)

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

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

如果要更改fwrite()的行为,请查看setbuf redirectionsetbuff() Linux man page函数Microsoft documentation on setbuf(),这里是Windows CreateFile() function

如果您查看基础Microsoft documentation topic File Buffering的文档,将会看到很多标志,其中包括有关是否应该进行数据缓冲的标志。

  

FILE_FLAG_NO_BUFFERING 0x20000000

     

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

     

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

然后查看https://superuser.com/questions/479379/how-long-can-file-system-writes-be-cached-with-ext4

  

在一个简单的示例中,应用程序将打开一个文件进行写入   使用setbuf()标志进行访问,然后执行   FILE_FLAG_NO_BUFFERING函数使用在   应用。在这种情况下,此本地缓冲区有效   此操作存在的唯一文件缓冲区。因为   物理磁盘布局,文件系统存储布局和系统级   文件指针位置跟踪,除非以下操作,否则此写操作将失败   本地定义的数据缓冲区符合某些对齐标准,   在下一节中讨论。

请看一下有关操作系统级别设置的讨论,这些设置看起来像是Linux https://docs.python.org/3/howto/regex.html

答案 1 :(得分:0)

  

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

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

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

因此,要确保将数据写入磁盘,您需要进行OS级调用,以等待队列写入完成。在POSIX系统(例如Linux)上,即fsync(fileno(fp))。您需要研究Windows文档,以了解如何在Windows上执行等效操作。