首页 > 解决方案 > 创建临时目录的可靠方法

问题描述

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

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

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

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

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

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

标签: clinuxposixtemporary-directory

解决方案


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

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

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

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


推荐阅读