我正在为一个库编写测试,该库需要创建一个目录来测试它应该提供的一些功能。我做了一些研究,发现有一个库函数:
#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
还有其他陷阱吗?除了共享静态缓冲区和竞争条件?
最佳答案
tmpnam()
函数不会创建目录;而是创建目录。它生成一个文件名,该文件名在调用它时的某个地方并不存在,但在您尝试将它与 mkdir()
一起使用时可能已经存在,它会创建目录。通常有大量相关函数可以完成大致相同的工作,但它们在每个平台上都不同。
POSIX 确实提供 mkdtemp()
和 mkstemp() - 前者创建一个目录,后者创建一个文件;同一页面记录了两者 - 您在其中指定函数的模板。这让您负责创建目录或文件的目录。
使用 mkstemp()
和 mkdtemp()
时,包含新文件或目录的目录必须已经存在。
使用 tmpnam() 的主要问题之一是您基本上无法控制文件的创建位置或文件名的外观。几乎所有其他功能都为您提供一定程度的控制。不线程安全通常不是一个主要问题——您可以提供一个将要使用的缓冲区,使其成为线程安全的。
关于c - 创建临时目录的可靠方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55539542/