我正在为一个需要编写目录以测试其应提供的功能的库编写测试。我做了一些研究,发现有一个库函数:
#include <stdio.h>
char *tmpnam(char *s);
可以用NULL
来调用它到唯一路径。问题是链接器警告我如下:
warning: the use of `tmpnam' is dangerous, better use `mkstemp'
也按照this answer中的建议使用该功能。但是开头的这种/tmp
硬编码看起来很有趣。另外,检查环境变量TMP
,TMPDIR
等看起来很复杂。
也许有一些POSIX函数可以为我检查这些变量?除了共享的静态缓冲区和竞争条件之外,使用tmpnam
还有其他陷阱吗?
答案 0 :(得分:1)
tmpnam()
函数不会创建目录;它会生成一个文件名,该文件名在调用时某处不存在,但是在您尝试与创建目录的mkdir()
一起使用时可能存在。通常有很多相关功能可以完成大致相同的工作,但是在每个平台上它们都是不同的。
POSIX确实提供了mkdtemp()
和mkstemp()
-前者创建目录,后者创建文件;相同的页面同时记录了两者-您在其中指定函数的模板。这样,您就可以负责在其中创建目录或文件的目录。
对于mkstemp()
和mkdtemp()
,包含新文件或目录的目录必须已经存在。
使用tmpnam()
的主要问题之一是,您基本上无法控制文件的创建位置或文件名。几乎所有其他功能都会为您提供一些控制措施。通常,不是线程安全的不是主要问题-您可以提供一个将用于线程安全的缓冲区。