临时文件
临时文件用于存储程序运行期间的中间数据,程序结束后应自动删除。C 标准库提供 tmpfile 和 tmpnam 创建临时文件,但 tmpnam 有安全风险,推荐使用 tmpfile 或系统特定 API。
tmpfile
#include <stdio.h>
FILE *fp = tmpfile(); /* 创建临时文件 */
if (fp != NULL) {
/* 读写操作 */
fprintf(fp, "Temporary data\n");
/* 回到开头读取 */
rewind(fp);
char line[256];
fgets(line, sizeof(line), fp);
printf("%s", line);
/* 关闭时自动删除 */
fclose(fp);
}
tmpfile 创建的文件在 fclose 或程序结束时自动删除,文件名不可见。
tmpnam(不推荐)
char filename[L_tmpnam];
tmpnam(filename); /* 生成临时文件名 */
FILE *fp = fopen(filename, "w+");
/* 使用 */
fclose(fp);
remove(filename); /* 手动删除 */
tmpnam 有竞态条件风险:生成文件名和创建文件之间,其他程序可能创建同名文件。
mkstemp(POSIX,更安全)
#include <stdlib.h>
#include <unistd.h>
char template[] = "/tmp/myfileXXXXXX";
int fd = mkstemp(template); /* 创建并打开临时文件 */
if (fd != -1) {
/* 使用文件描述符 */
write(fd, "Hello\n", 6);
close(fd);
/* 手动删除 */
unlink(template);
}
常见错误
tmpnam 安全风险:
char *name = tmpnam(NULL); /* 危险:竞态条件 */
FILE *fp = fopen(name, "w"); /* 可能打开别人创建的文件 */
/* 正确:用 tmpfile 或 mkstemp */
忘记删除:
FILE *fp = fopen(tmpnam(NULL), "w");
/* 使用 */
fclose(fp);
/* 忘记 remove → 临时文件残留 */
最佳实践
- 优先使用
tmpfile - 需要文件名时用
mkstemp(POSIX) - 避免
tmpnam - 确保临时文件最终删除
- 敏感数据注意权限设置