【问题标题】:Reliable way to create temporary directory [duplicate]创建临时目录的可靠方法[重复]
【发布时间】:2019-04-05 16:12:24
【问题描述】:

我正在为一个库编写测试,该库需要创建一个目录来测试它应该提供的一些功能。我做了一些研究,发现有一个库函数:

#include <stdio.h>
char *tmpnam(char *s);

并且可以使用NULL 将其调用为唯一路径。问题是链接器警告我如下:

warning: the use of `tmpnam' is dangerous, better use `mkstemp'

也按照this answer 中的建议使用该功能。但是一开始的这种硬编码/tmp 看起来很奇怪。还要检查环境变量TMPTMPDIR等看起来很复杂。

也许有一些 POSIX 函数可以为我检查这些变量?除了共享静态缓冲区和竞争条件之外,使用tmpnam 是否还有其他陷阱?

【问题讨论】:

标签: c linux posix temporary-directory


【解决方案1】:

tmpnam() 函数不创建目录;它会生成一个文件名,该文件名在调用它时某处不存在,但在您尝试将它与mkdir() 一起使用时可能存在,它确实创建了目录。通常有大量相关功能可以完成大致相同的工作,但在每个平台上它们是不同的。

POSIX 确实提供了mkdtemp()mkstemp()——前者创建目录,后者创建文件;同一个页面记录了这两者——您在其中为函数指定模板。这让您负责在其中创建目录或文件的目录。

对于mkstemp()mkdtemp(),包含新文件或目录的目录必须已经存在。

使用tmpnam() 的主要问题之一是您基本上无法控制文件的创建位置或文件名的外观。几乎所有其他功能都为您提供了一定程度的控制。不是线程安全的通常不是主要问题——您可以提供一个将被使用的缓冲区,使其成为线程安全的。

【讨论】:

  • 我想如果我简单地将XXXXXX 指定为模板,我会在当前工作目录中创建一个新目录(我试过了,它就是这样工作的)。但它没有记录在man page
  • POSIX 规定名称必须以至少 6 个 X 结尾;该名称以 6 个 X 结尾(并以 6 个 X 开头),因此它是一个有效的模板,并且生成的名称用于当前目录,因为路径中没有 / 表明它位于其他任何位置。所以,这应该有效。为文件使用一些前缀可能更传统,以指示创建它的程序是哪个程序,但实际上并不是强制性的。
猜你喜欢
  • 2013-02-19
  • 1970-01-01
  • 1970-01-01
  • 2017-10-06
  • 1970-01-01
  • 2011-05-29
  • 1970-01-01
  • 2017-01-24
  • 1970-01-01
相关资源
最近更新 更多