c - 创建临时目录的可靠方法

标签 c linux posix temporary-directory

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

#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/

相关文章:

objective-c - 尝试制作圆角 UIImage 时的性能问题(使用 mask )

c - 如何在C/Cilk中以线程安全的方式打印?

python - 如何使用 Py2Neo 修复 Linux 上的 IncompleteRead 错误

php - 从带引号的标签和值的格式化分隔字符串中获取值

python - 为什么 os.path.getsize() 对于 10gb 的文件返回负数?

c++ - 将 Linux 打开、读取、写入、关闭功能转换为在 Windows 上工作

c - 有没有办法规范化不存在文件的文件路径?

c++ - Waitpid和同步问题

c - 尝试编译 C 程序时,如何解决 AIX 机器上的 undefined symbol 错误?

c++ - 函数可以访问传递给 main() 的参数吗?