【发布时间】:2013-03-26 14:39:16
【问题描述】:
我需要我的代码(C++,在 linux 上)调用第二个可执行文件,之前编写了一个输出文件,该文件可以被第二个程序读取。是否天真的方法,
std::ofstream out("myfile.txt");
// write output here
out.close();
system("secondprogram myfile.txt");
遇到潜在的竞争条件,即使 out.close() 已执行,secondprogram 也无法立即读取该文件?如果是这样,解决此问题的最佳做法是什么?
三个注意事项:
- 如果这取决于文件系统,我对 ext3 和 tmpfs 上的行为感兴趣。
- 显然还有其他原因(文件权限等)导致第二个程序可能无法打开文件;我只是对竞争条件的可能性感兴趣。
- 上例中的硬编码文件名是为了简单起见;实际上我使用
mkstemp。
【问题讨论】:
-
是的,这是有保证的。你确定问题是关于那个的吗?你
strace你的程序了吗? -
@BasileStarynkevitch 我(还)没有遇到问题:我只是想检查一下我不会有一个未来。您能否详细说明是 C++、Linux、文件系统还是其他东西在做出这种保证?
-
我想说他们都必须保证部分内容:您的 C++ 实现必须保证缓冲区已刷新,并且
close()仅在close文件的相关系统调用之后返回已返回,内核必须保证在系统调用返回后,文件是可打开的,并且通过旧句柄所做的所有更改都是可见的,并且 VFS 必须保证正确处理缓存。我同意@BasileStarynkevitch 的观点:所有这些都应该成立,你不应该遇到问题。 -
太好了 - 谢谢。如果你们中的一个写了一个答案,我会接受它。
标签: c++ linux file-io race-condition