在ofstream :: close()返回后,文件是否可以保证可以立即读取?

Chr*_*son 7 c++ linux file-io race-condition

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

std::ofstream out("myfile.txt");
// write output here
out.close();
system("secondprogram myfile.txt");
Run Code Online (Sandbox Code Playgroud)

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

三个音符:

  • 如果这是依赖于文件系统的,我对ext3和tmpfs的行为感兴趣.
  • 显然还有其他原因(文件权限等),为什么第二个程序可能无法打开文件; 我只是对竞争条件的潜力感兴趣.
  • 上面示例中的硬编码文件名是为了简单起见; 实际上我用mkstemp.

us2*_*012 1

我之前错过了一个潜在的故障模式:当文件无法打开时,您似乎没有办法恢复secondprogram。问题在于文件在返回后可能被锁定/不一致,而是另一个与您的程序完全无关的程序可能会在和close()之间打开该文件(例如,AV 扫描仪、某人浏览包含该文件的目录、备份过程) )。如果发生这种情况,即使您的程序行为正确,也会失败。close()system()grepsecondprogram

secondprogramTL/DR:即使一切按预期工作,您也必须考虑可能无法打开文件的情况!