c - 创建临时目录的可靠方法
问题描述
我正在为一个库编写测试,该库需要创建一个目录来测试它应该提供的一些功能。我做了一些研究,发现有一个库函数:
#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()
是您基本上无法控制文件的创建位置或文件名的外观。几乎所有其他功能都为您提供了一定程度的控制。不是线程安全的通常不是主要问题——您可以提供一个将被使用的缓冲区,使其成为线程安全的。
推荐阅读
- python - 从 wikisource XML 转储文件中提取文本
- python-3.x - 如何将 AWS Glue df 列数据写入单独的 html 文件
- python - 无法更新模型,因为“id 已存在”
- javascript - Ant Design 在 react js 项目中不起作用
- java - 方法调用“getMessage”可能会产生“NullPointerExeption”
- java - 休眠在数据库端设置默认值的正确方法
- javascript - REACT JS:TypeError:无法读取未定义的属性“参数”
- jmeter - 使用 MQTT 发布者通过 Jmeter 连接到 TLS
- c - 使用 C 代码从 DFRWS 2007 数据集中检索 PPT 文件
- javascript - 您可以替换 Visual Studio 代码中所有打开文件中的变量及其值吗?