【问题标题】:How does boost::filesystem::unique_path() resolve the need in mkstemp analogue in C++?boost::filesystem::unique_path() 如何解决 C++ 中 mkstemp 模拟的需求?
【发布时间】:2017-05-12 20:37:32
【问题描述】:

用于 Boost 的旧 feature request 要求在 Boost.Filesystem 中提供类似于 mkstemp POSIX 函数的功能。该问题已解决已久,并附有评论

版本 3 中的 unique_path() 函数解决了这个问题。

但我看不到unique_path 是如何解决问题的。与tmpnam基本相同:在生成名称之后,在创建实际文件之前,另一个程序可能已经创建了同名的文件。

那么它应该如何解决mkstemp 的需求呢?

【问题讨论】:

  • 无论您选择哪个文件名,其他程序可能已经在使用它。但是由于生成一个相当独特的文件路径非常简单,因此几乎不会发生这种冲突。
  • 不过,unique_path 被认为是足以在 C++17 中被拒绝的安全漏洞:wg21.cmeerw.net/lwg/issue2633

标签: c++ boost temporary-files boost-filesystem


【解决方案1】:

我的猜测是,该实现(至少在 *nix 系统上)可能会导致有效地使用 O_EXCL | O_CREAT 调用 open,这基本上是说“创建文件,如果它已经存在,则返回错误。

所以,一个实现可以有这样的算法:

for(;;) {
    name = create_likley_unique_name();
    file = open(name, O_EXCL | O_CREAT, mode);
    if(valid(file)) {
        return file;
    }
}

这当然只是一个猜测,但我认为这是一个合理的猜测。我不知道 windows 或 osx 是否有类似的标志。

我认为您链接的页面上“解决方案”的关键部分是这部分:

建议的解决方法是 (1) 重命名函数并 (2) 提供 如何通过 fstreams 甚至 C I/O 安全地使用该函数的示例。 建议措辞见下文。

一个合适的例子就像我刚刚写的那样,但是使用一个等效的 c++ish API。

请注意,在线程中他们提供将函数重命名为generate_random_filename(),考虑到它是不可预测的,这更合适,但不能保证是唯一的。但也建议create_unique_file(),它可能会实现类似于我的示例的算法。

【讨论】:

  • 获得类似于O_EXCL 的行为的唯一方法在 C11 中可用(因此在 C++17 之前的 C++ 中不可用):fopen(testFileName,"w+x")。 7 年前关闭功能请求时,它还没有真正可用,甚至无法想象。
  • 是的,我认为这些功能的实现必须使用非标准的系统特定代码。如果是标准库,这对这些人来说是可以接受的。
猜你喜欢
  • 2017-09-05
  • 1970-01-01
  • 2013-08-16
  • 2010-10-03
  • 2016-06-02
  • 2021-08-15
  • 1970-01-01
  • 1970-01-01
  • 2011-06-14
相关资源
最近更新 更多