不推荐使用 tmpnam 的原因是存在安全漏洞,容易引发竞态条件。1. tmpfile 可自动管理临时文件生命周期,安全性高但无法获取文件路径;2. mkstemp 通过修改模板字符串生成唯一文件名并返回已打开的文件描述符,避免竞态条件;3. windows 平台可使用 gettempfilename 创建临时文件并在使用后手动删除;4. 跨平台项目建议封装不同实现并采用 raii 管理资源,及时清理临时文件以避免安全隐患。

在C++中创建临时文件,很多人第一时间想到的是 tmpnam 函数。但其实这个函数已经被标记为不推荐使用(deprecated),主要原因是它存在安全漏洞,容易引发竞态条件,导致程序被恶意利用。

如果你希望安全、可靠地创建临时文件,可以考虑使用标准库提供的替代方案或系统调用接口。下面介绍几种更安全的替代方法及使用示例。
tmpnam 的问题在于它只是生成一个“看起来安全”的临时文件名,并不实际创建文件。这就带来了一个隐患:如果两个线程或者两个进程几乎同时调用了这个函数,它们可能会生成相同的文件名。此时如果其中一个程序删除了另一个刚创建的临时文件,就可能造成数据丢失甚至安全问题。
立即学习“C++免费学习笔记(深入)”;

此外,攻击者还可以通过预测生成的文件名来提前创建同名文件,从而实施符号链接攻击等手段。
tmpfile
如果你不需要保留临时文件的内容,只需要一个临时的缓冲区用于读写,那么最简单的方式就是使用 tmpfile 函数:

#include <cstdio>
int main() {
FILE* tmp = tmpfile();
if (tmp == nullptr) {
// 处理错误
return 1;
}
fprintf(tmp, "这是临时内容");
rewind(tmp);
char buffer[100];
fgets(buffer, sizeof(buffer), tmp);
puts(buffer);
fclose(tmp); // 文件会自动删除
}优点:
缺点:
mkstemp
如果你想获得一个临时文件的路径,并且保证其安全性,可以使用 mkstemp 函数。它是 POSIX 标准的一部分,在 Linux 和 macOS 上都可以使用。
使用方式如下:
#include <cstdlib>
#include <fcntl.h>
#include <unistd.h>
#include <iostream>
int main() {
char templatePath[] = "/tmp/mytempXXXXXX";
int fd = mkstemp(templatePath);
if (fd == -1) {
std::cerr << "创建失败\n";
return 1;
}
// 可以用 fd 操作文件,也可以转换为 FILE*
FILE* fp = fdopen(fd, "w+");
if (fp) {
fprintf(fp, "写入一些内容");
fclose(fp);
}
// 用完记得删除文件(可选)
unlink(templatePath);
}关键点:
X
mkstemp 会修改模板字符串的内容,填入随机字符GetTempFileName
如果你是在 Windows 平台上开发,可以使用 Win32 API 提供的 GetTempFileName 函数:
#include <windows.h>
#include <iostream>
int main() {
char path[MAX_PATH];
DWORD result = GetTempFileNameA(".", "myprefix", 0, path);
if (result == 0) {
std::cerr << "创建失败\n";
return 1;
}
// 使用完成后删除文件
DeleteFileA(path);
}说明:
. 表示当前目录)基本上就这些。tmpnam 虽然方便,但确实有安全缺陷。换用 mkstemp 或 tmpfile 是更好的选择,特别是在服务端或涉及用户输入的程序中。
以上就是如何用C++创建临时文件 tmpnam安全替代方案与使用示例的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号