fwrite阻塞,直到数据写入磁盘?

Pen*_*200 2 c++ windows fwrite

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

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

在这种特殊情况下,我对Windows 10的行为感到好奇.

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

Ric*_*ers 6

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

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

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

如果你看一下底层Windows CreateFile()功能的文档,你会看到有很多标志包含关于是否应该进行数据缓冲的标志.

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