Skip to content

2009年 408 操作系统 第 31 题

操作系统2009年选择题2分

题目

设文件 F1 的当前引用计数值为 1,先建立 F1 的符号链接(软链接)文件 F2,再建立 F1 的硬链接文件 F3,然后删除 F1。此时,F2 和 F3 的引用计数值分别是( )。

错因

A

把 F2 引用计数算成 0——但 F2 是个独立的软链接文件,自己有自己的 inode、自己有目录项指着它,引用计数 = 1(不会因为 F1 被删而变 0)。F2 自身没被删,它的 inode 引用计数和 F1 是否存在无关。

C

F3 = 2 错——F3 是硬链接到 F1 的 inode,建立时该 inode 计数 1 + 1 = 2;但删 F1 时这个 inode 计数 -1 = 1(F1 的目录项消失,F3 还指着 inode)。停在中间状态没把"删 F1"算进去就得 2。

D

F2 = 2 错——F2 自身只被一个目录项(自己的目录项)引用,计数始终 1。把 F2 当成"也是硬链接"才会算成 2,但 F2 是软链接,它和 F1 的 inode 没关系

总解析

关键概念

概念含义引用计数指什么
硬链接多个目录项指向同一个 inode该 inode 被几个目录项引用
软链接(符号链接)一个独立文件,内容是另一文件的路径字符串该软链接文件自己的 inode 被几个目录项引用

关键差异

  • 硬链接和原文件共享 inode,建硬链接 → 原 inode 计数 +1;删原文件目录项 → 原 inode 计数 -1
  • 软链接有独立 inode,跟原文件 inode 计数无关

逐步追踪

步骤F1 的 inode 计数F2(软链接)计数F3 的 inode
初始(F1 计数 = 1)F1.inode = 1
建 F2(软链接)F1.inode = 1(软链接不影响)F2.inode = 1(独立 inode)
建 F3(硬链接到 F1)F1.inode = 2(硬链接 +1)F2.inode = 1与 F1 共享,计数 = 2
删 F1(仅删目录项)F1.inode = 1(-1)F2.inode = 1同上 inode,计数 = 1(F3 还指着它)

最终状态

文件引用计数说明
F2(软链接)1自身 inode 被一个目录项引用(自己的)
F3(硬链接)1指向原 F1 的 inode,目前只剩 F3 这一个目录项指着它

关键判定:

  • 建软链接不改变原 inode 计数(软链接是独立文件)
  • 建硬链接让原 inode 计数 +1(共享 inode 多了一个引用)
  • 删原文件让其 inode 计数 -1(少一个引用),但 inode 本身只在计数归 0 时才真删

注意 F2(软链接)的特殊性:F1 被删后 F2 变成悬空软链接(dangling symlink),但 F2 自身的引用计数依然是 1(自己还在)。访问 F2 会失败,但文件存在。

最终答案是 B

编者注(解题技巧):链接计数题两条线分开追——一张表追"原文件 inode 计数"(只受硬链接和原目录项增删影响),另一张表追"软链接自己的计数"(与原文件无关,软链接是独立文件)。混在一起算,必丢分。

最后更新:

⚠️ 这道题暂未配可视化,欢迎在 CodeBrick 反馈区告诉我们你想看哪道题