c++ - 文件何时真正写入磁盘?是否保证在 std::ofstream 被破坏后立即将文件写入磁盘?

标签 c++ linux c++11

对于the code snippet下面,当 std::fstream 被销毁时,是否保证文件立即写入磁盘?

#include<iostream>
#include<fstream>
using namespace std;
int main(int argc,char* argv[]){
    
    {
        std::fstream file{"test.txt"};

        file << "when the file is actually written out?" << std::endl;
    }
    
    return 0;
}

最佳答案

将我的评论改写为实际答案:

没有。该代码片段不保证数据位于“持久存储”上。您告诉操作系统获取该文件并存储它。但操作系统获取该数据并将其提供给 IO 调度程序。调度程序执行或不执行的操作(部分)超出您的控制范围,因为它会按其认为合适的方式安排任务。

但是,您可以通过调用sync()强制调度程序将所有挂起的元数据和数据写入“持久存储”(读取:实际文件系统)

https://man7.org/linux/man-pages/man2/sync.2.html

警告,假设:可能存在的问题是您正在统治调度程序。因此,如果该机器上的另一个程序有一个巨大的文件要写入,并且调度程序希望等待该文件写入,因为现在 io 通常很高。如果您调用sync(),您会强制调度程序写入所有(元)数据,因此它也会写入该文件。直到所有数据写入后,同步才会返回。您的写入在队列中的位置并不重要,因此实际上可能需要几秒钟(即使在慢速 io 和 Hughe 文件上也需要几分钟)才能返回该调用。

不知道如何在 Windows 上执行此操作,或者 Windows 实际上如何处理磁盘写入

关于c++ - 文件何时真正写入磁盘?是否保证在 std::ofstream 被破坏后立即将文件写入磁盘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73483179/

相关文章:

c++ - 使用 C++ 元编程构建静态字符串

c++ - 在没有 boost::counting_iterator 的情况下插入一系列连续整数的最佳方法

c++ - 如何在 Ubuntu 上安装和构建 OpenSSL 1.0.0?

c++ - MySQL C++ 不读取结果

c - 动态电压和频率缩放 API

c++ - 智能指针作为 QObject::deleteLater() 的替代品

java - 如何使用 Mongodb C++ 避免重复

c - 如何像在 linux 内核中一样从头开始实现 container_of

linux - 比较两个文件并打印匹配的数据

c++ - `decltype` 并将 ADL 查找与非 ADL 查找混合