c++如何利用tmpfile自动创建并管理匿名临时文件_标准库API【实战】

大强大大_9812

大强大大_9812

2026-03-24

452人浏览

原创

tmpfile() 创建的文件没有路径名,其背后是不关联文件系统路径的匿名 inode。它适用于临时缓冲且无需路径的场景,但不支持 mmap、跨进程共享或权限设置;fclose() 后文件立即消失,因底层使用 unlink() 或 O_TMPFILE 使 inode 引用归零。

c++如何利用tmpfile自动创建并管理匿名临时文件_标准库api【实战】

tmpfile() 创建的文件到底有没有路径名

tmpfile() 返回的是一个打开的 FILE*,背后对应内核中真实存在的匿名 inode,但**不关联任何文件系统路径**。这意味着你无法用 ls、stat 或其他外部工具看到它,也无法通过 open("/proc/self/fd/N") 反向获取路径(除非自己用 readlink("/proc/self/fd/N") 查,但返回的是 (deleted))。

常见错误是试图对 tmpfile() 的返回值调用 fileno() 后再传给 mkstemp() 风格的路径操作——没意义,因为根本没路径。

  • 适用场景:需要临时缓冲、中间数据暂存,且不希望文件残留或被其他进程猜到路径
  • 不适用场景:需要 mmap、需要跨进程共享、需要显式设置权限或扩展属性
  • 注意:tmpfile() 在大多数 libc 实现中会自动加 O_CLOEXEC,但别依赖——fork 后子进程若未显式 fclose(),文件描述符仍会继承(只是父进程 fclose 后子进程还能读写)

为什么 fclose() 后文件就立刻消失,而不是等进程退出

因为 tmpfile() 底层通常等价于先 open("/tmp", O_TMPFILE | O_RDWR)(Linux 3.11+),或 mkstemp() + unlink() 组合。关键在 unlink() 是立即执行的:文件 inode 引用计数归零时内核直接回收空间。

所以只要调用 fclose(),底层 fd 关闭,inode 引用只剩 FILE* 自身;而 fclose() 内部会 close fd 并释放结构体,引用计数清零,文件内容立刻不可访问。

  • 陷阱:如果用 dup(fileno(fp)) 复制了 fd,只 fclose(fp) 不够,必须也 close() 那个 dup 出来的 fd,否则文件不会释放
  • 验证方法:在 fclose() 前用 lsof -p $PID | grep deleted 能看到该 fd 对应 (deleted) 条目
  • Windows 上行为不同:tmpfile() 实际会创建带随机名的真实文件,并在 fclose() 时 unlink(),但路径可被猜测(不推荐生产环境用)

tmpfile() 和 tmpfile_s() 的安全差异在哪

tmpfile_s() 是 C11 Annex K 的“安全函数”,要求传入一个 errno_t* 输出参数,并在失败时设 *errnum = errno。但它**不比 tmpfile() 更安全**:两者都可能因磁盘满、权限不足、ulimit 限制失败,且 tmpfile_s() 在多数 Linux libc(如 glibc)里压根没实现,链接时报 undefined reference。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载

真正影响安全的是调用上下文:

  • 不要在 setuid 程序里用 tmpfile()——它默认使用 /tmp 目录,而该目录通常是全局可写,存在符号链接竞争风险(尽管 O_TMPFILE 可缓解)
  • 更稳妥的做法是用 mkstemp() 配合 secure_getenv("TMPDIR") 和手动 unlink(),可控性更强
  • tmpfile() 不接受自定义模板或目录,无法规避 /tmp 满或 noexec 挂载等问题

用 tmpfile() 写二进制数据要注意什么

默认以文本模式打开(C 标准规定 tmpfile() 等价于 fopen(..., "w+b")),但 Windows 下文本模式会把 \n 转成 \r\n,破坏二进制一致性。

  • 务必用 fwrite() / fread(),别用 fputs() / fgets()
  • 写完后用 fflush(fp) 确保数据落盘,尤其后续要 rewind() 或 fseek()
  • 如果需 mmap,得先 fflush() + fileno() + msync(),但注意:O_TMPFILE 文件不能 mmap(ENODEV),此时必须换 mkstemp()
  • 错误现象举例:fwrite(buf, 1, len, fp) 后直接 rewind(fp) 读,却读到全 0——大概率是忘了 fflush() 导致缓冲区未写入

临时文件管理的核心不是“怎么建”,而是“谁负责删、何时删、删不掉怎么办”。tmpfile() 把删除时机锁死在 fclose(),看似省心,实则掩盖了资源生命周期的复杂性。比如异常分支漏掉 fclose(),或者 longjmp 跳过清理,文件就卡在内核里直到进程退出——这种隐式依赖,比显式 unlink() 更难调试。

大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
fclose函数的用法
fclose函数的用法

fclose是一个C语言和C++中的标准库函数,用于关闭一个已经打开的文件,是文件操作中非常重要的一个函数,用于将文件流与底层文件系统分离,释放相关的资源。更多关于fclose函数的相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.30

842

9

fgets在c语言中的用法
fgets在c语言中的用法

本专题整合了c语言中fgets用法介绍,阅读专题下面的文章了解更多详细内容。

2025.08.27

153

4

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

2025.06.09

5434

18

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

2025.07.04

5611

25

undefined是什么
undefined是什么

undefined是代表一个值或变量不存在或未定义的状态。它可以作为默认值来判断一个变量是否已经被赋值,也可以用于设置默认参数值。尽管在不同的编程语言中,undefined可能具有不同的含义和用法,但理解undefined的概念可以帮助我们更好地理解和编写程序。本专题为大家提供undefined相关的各种文章、以及下载和课程。

2023.07.31

12385

4

网页undefined是什么意思
网页undefined是什么意思

网页undefined是指页面出现了未知错误的意思,提示undefined一般是在开发网站的时候定义不正确或是转换不正确,或是找不到定义才会提示undefined未定义这个错误。想了解更多的相关内容,可以阅读本专题下面的文章。

2024.08.14

5547

7

网页undefined啥意思
网页undefined啥意思

本专题整合了undefined相关内容,阅读下面的文章了解更多详细内容。后续继续更新。

2025.12.25

2516

7

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.26

3479

3

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.27

3038

6

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习