c++ - 文件是否保证在 ofstream::close() 返回后可以立即打开以供读取?

标签 c++ linux file-io race-condition

我需要我的代码(C++,在 Linux 上)调用第二个可执行文件,之前已经编写了一个由第二个程序读取的输出文件。天真的方法,

std::ofstream out("myfile.txt");
// write output here
out.close();
system("secondprogram myfile.txt");

存在潜在的竞争条件,即使 out.close() 已执行,文件也不能立即被 secondprogram 读取?如果是这样,解决此问题的最佳做法是什么?

三个注意事项:

  • 如果这是文件系统相关的,我对 ext3 和 tmpfs 上的行为很感兴趣。
  • 显然还有其他原因(文件权限等)导致第二个程序无法打开文件;我只是对竞争条件的可能性感兴趣。
  • 上例中的硬编码文件名是为了简单起见;实际上我使用 mkstemp

最佳答案

一旦文件关闭,所有写入的数据都保证从 ofstream 的缓冲区中清除。对象(因为此时你可以销毁它而不会有丢失任何数据的风险,如果需要的话,实际上关闭文件是由析构函数在内部完成的)。这并不意味着此时数据将物理地存储在磁盘上(可能不会,因为操作系统磁盘驱动程序的缓存行为),但在同一操作系统中运行的任何程序都能够一致地读取文件(因为操作系统随后将执行从缓存数据中读取)。如果您需要将操作系统缓冲区刷新到磁盘(您的secondprogram 不需要它来正确读取输入文件),那么您可能需要查看 sync()<unistd.h> 中发挥作用.

关于c++ - 文件是否保证在 ofstream::close() 返回后可以立即打开以供读取?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15639814/

相关文章:

c++ - 使用另一个类的变量

Linux 保留堆大小

python - 到不同端口的多个 OpenVPN 连接

linux - IPtables block 范围异常

java - 创建新目录

回调中生产者和消费者之间的 C++ 循环模板依赖

c++ - 使用内联方法和类从 header 创建 .cpp 文件

c++ - 我无法打开可变文件名

C# I/O - System.IO.File 和 StreamWriter/StreamReader 之间的区别

c++ - 将数据从 OpenCV C++ 传递到 NodeJS/JS | Electron