You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关闭文件描述符后删除内存映射文件的最后硬链接是否安全?

关于unlink已mmap文件的行为解析

好问题!咱们结合Unix/Linux文件系统的核心逻辑,一步步拆解这个场景:

首先得明确一个关键概念:文件的目录项(硬链接)和inode是分离的。目录项只是用来让用户找到文件的“指针”,而inode才是真正存储文件元数据(大小、权限、数据块位置等)的结构,其中还有一个link count(链接计数)字段,记录有多少个硬链接指向这个inode。

接下来看你的操作流程和后续情况:

  • 你通过open()拿到文件描述符,用mmap()把文件映射到进程地址空间,随后close()关闭了fd。这时候你的进程虽然没有持有文件描述符,但mmap建立的内存映射会让内核保留对该inode的引用——因为映射的是inode对应的文件数据,和目录项无关。
  • 当有人执行unlink(db_path)删除最后一个硬链接时,系统会先删除对应的目录项,然后检查inode的链接计数:此时计数会减到0,但内核还会检查是否有进程在使用这个文件(包括通过mmap映射,或者持有未关闭的fd)。
  • 由于你的进程还在使用mmap出来的buffer,内核内部的inode使用计数依然大于0,所以文件的实际数据不会被立刻删除,你依然可以正常访问buffer里的内容,完全不受unlink操作的影响。

直到你调用munmap(buffer, info->st_size)之后,内核会释放这个内存映射对应的inode引用。这时候系统再次检查:链接计数已经是0,且没有任何进程再使用该文件,内核才会真正把inode标记为可用,同时回收文件数据占用的磁盘空间。

额外补充一个常见的用法:很多程序会创建临时文件后立刻执行unlink,然后通过fd或mmap操作文件——这样即使程序意外崩溃,磁盘也不会留下残留的临时文件,因为进程退出后内核会自动清理这些无引用的inode。

内容的提问来源于stack exchange,提问作者martinkunev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:29:55