创建临时目录的可靠方法

Reliable way to create temporary directory

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

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

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

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

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

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

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

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

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

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