Appearance
题目
设文件 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 计数"(只受硬链接和原目录项增删影响),另一张表追"软链接自己的计数"(与原文件无关,软链接是独立文件)。混在一起算,必丢分。