c++ - fwrite 在数据写入磁盘之前会阻塞吗?
问题描述
该fwrite()
函数是在将要写入磁盘的数据移交给操作系统后返回,还是仅在数据实际物理写入磁盘后才返回?
对于我的情况,我希望这是第一种情况,因为我不想等到所有数据都物理写入磁盘。我希望另一个操作系统线程在后台传输它。
在这种特殊情况下,我很好奇 Windows 10 上的行为。
https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/fwrite
解决方案
为了提高使用时的效率,有几个地方需要缓冲数据fwrite()
:C++ 运行时中的缓冲和操作系统文件系统接口中的缓冲以及实际磁盘硬件中的缓冲。
这些默认设置是延迟实际将数据物理写入磁盘,直到有刷新缓冲区的实际请求或在发出写入请求时打开适当的指示器以执行物理写入。
如果您想更改行为,fwrite()
请查看setbuf()
函数setbuf 重定向以及setbuff()
Linux 手册页,这里是Microsoft 文档setbuf()
。
如果您查看底层WindowsCreateFile()
函数的文档,您会看到有许多标志,其中包括是否应该进行数据缓冲的标志。
FILE_FLAG_NO_BUFFERING 0x20000000
正在打开的文件或设备没有用于数据读取和写入的系统缓存。此标志不影响硬盘缓存或内存映射文件。
使用 FILE_FLAG_NO_BUFFERING 标志成功处理使用 CreateFile 打开的文件有严格的要求,有关详细信息,请参阅文件缓冲。
在一个简单的示例中,应用程序将使用该标志打开一个文件进行写访问,
FILE_FLAG_NO_BUFFERING
然后WriteFile
使用应用程序中定义的数据缓冲区执行对该函数的调用。在这些情况下,此本地缓冲区实际上是此操作存在的唯一文件缓冲区。由于物理磁盘布局、文件系统存储布局和系统级文件指针位置跟踪,此写入操作将失败,除非本地定义的数据缓冲区满足某些对齐标准,这将在下一节中讨论。
看看这个关于操作系统级别设置的讨论,看起来像是 Linux https://superuser.com/questions/479379/how-long-can-file-system-writes-be-cached-with-ext4
推荐阅读
- sql-server - T-SQL 从字符串中提取数字以及介于两者之间的所有内容
- java - Mac 上 Android Studio 的 .idea 目录在哪里?
- sqlite - Sqlite 返回最新值与 24 小时前值之间的行差异
- python - 来自列表 python 的字典
- ios - Swift - 纵向视频的帧尺寸
- mysql - 如何在 SQL 中使用 COUNT 和 JOIN?
- java - 为什么当链被拆分为多个部分时,ExpressionInterceptUrlRegistry 调用链会丢失类型信息?
- javascript - 如何在引导手风琴中切换加号到减号,反之亦然
- python - 在门户(门户模块)网站odoo13上添加新文件
- apache-flink - 如何为 flink 做贡献?