我需要我的代码(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/