7

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

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

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

三个注意事项:

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

3 回答 3

3

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

于 2013-03-26T15:04:57.933 回答
1

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

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

于 2013-03-26T15:13:40.597 回答
0

根据cplusplus.com,当所有数据都写入磁盘后,该函数将返回。所以不应该有竞争条件。

于 2013-03-26T14:41:43.807 回答