is_regular_file后我有什么保障?

What guarantee do I have after is_regular_file?

考虑一个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());
  // ...
  // ...
  // ...
}

您唯一能保证的是在调用时,路径是一个普通文件。因为文件系统 是隐含的竞争条件 boost::filesystem::is_regular_file(p1)std::ifstream f1(p1.c_str()) 之间的调用实际上可能指的是两个不同的 对象 .

考虑场景:

  • 进程 1 调用 boost::filesystem::is_regular_file(p1),成功并确定它是一个 "normal" 文件
  • 进程 2 删除 p1
  • 指向的路径
  • 进程 1 调用 std::ifstream f1(p1.c_str()),但未能打开文件

你能在这里看到竞争条件吗?