在数据写入磁盘之前,fwrite 会阻塞吗?
Does fwrite block until data has been written to disk?
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上执行等效操作。
- 防止主数据类型C++的隐式转换
- 用于访问容器<T>数据成员的正确 API
- 嵌套在类中时无法设置成员数据
- 使用流处理接收到的数据
- 静态数据成员的问题-修复链接错误会导致编译器错误
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 在cuda线程之间共享大量常量数据
- C++将文本文件中的数据读取到结构数组中
- 如何在C++中序列化结构数据
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 通过套接字[TCP]传输数据 如何在C / C ++中打包多个整数并使用send() recv()传输数据
- 在c代码之间共享数据的最佳方式
- 链表,反向函数,数据结构
- 数据成员SFINAE的C++17测试:gcc vs clang
- C++浮点数据类型和字符串数据类型无法子到模板函数中
- 如何对点云数据进行排序
- 在数据写入磁盘之前,fwrite 会阻塞吗?
- 相当于二进制数据的字符 * 的 fwrite
- 如何确保fwrite后数据在磁盘上
- 使用fwrite C++将压缩数据写入文件