在is_regular_file之后我有什么保证?

时间:2016-03-15 21:08:20

标签: c++ boost-filesystem

考虑boost::filesystem::path p,是否可以同时拥有boost::filesystem::is_regular_file(p) == truestd::ifstream(p.c_str()).is_open() == false?如果是,在哪种情况下?

上下文是为比较函数编写断言:

bool identical_files(const boost::filesystem::path& p1, const boost::filesystem::path& p2)
{
  assert(boost::filesystem::is_regular_file(p1));
  assert(boost::filesystem::is_regular_file(p2));
  std::ifstream f1(p1.c_str());
  assert(f1.is_open()); // IS THIS REDUNDANT ???
  std::ifstream f2(p2.c_str());
  assert(f2.is_open());
  // ...
  // ...
  // ...
}

1 个答案:

答案 0 :(得分:4)

唯一的保证是,在通话时,路径是常规文件。由于文件系统隐式是竞争条件boost::filesystem::is_regular_file(p1)std::ifstream f1(p1.c_str())之间的通话实际上可能是指两个不同的对象

考虑一下情景:

  • 流程1调用boost::filesystem::is_regular_file(p1),成功并确定它是"正常"文件
  • 进程2删除p1
  • 指向的路径
  • 进程1调用std::ifstream f1(p1.c_str()),无法打开文件

你能看到这里的竞争状况吗?