Appearance
题目
若文件 f1 的硬链接为 f2,两个进程分别打开 f1 和 f2,获得对应的文件描述符为 fd1 和 fd2,则下列叙述中,正确的是( )。
Ⅰ. f1 和 f2 的读写指针位置保持相同
Ⅱ. f1 和 f2 共享同一个内存索引结点
Ⅲ. fd1 和 fd2 分别指向各自的用户打开文件表中的一项
错因
A
只承认 Ⅲ,漏了 Ⅱ"共享内存索引结点"——但硬链接的核心定义就是 f1、f2 指向同一个 inode(磁盘 inode 共享 → 加载到内存后内存 inode 也共享)。这是硬链接区别于软链接的关键性质,漏了它就是没记住硬链接是什么。
C
把 Ⅰ 选了——但两个进程独立打开 f1 和 f2 会建立各自独立的系统打开文件表项(虽然指向同一 inode),各自的读写指针完全独立。两个进程各自 read 几次互不影响,指针不会"自动同步"。把"硬链接"和"dup() 复制 fd"混了——dup 之下的 fd 才共享指针。
D
把 Ⅰ Ⅱ Ⅲ 全选,掉进了 Ⅰ 的陷阱——Ⅰ 错(指针不同步)。Ⅱ Ⅲ 都对但 Ⅰ 错就不能选 D。
总解析
硬链接:两个目录项指向同一个 inode(磁盘上)。f1 和 f2 是同一个文件的两个名字。
两个进程独立打开会经过一套标准的文件描述符层次:
进程 A 的 fd 表 [fd1] ──→ 系统打开文件表项 ① ──→ 内存 inode 表
进程 B 的 fd 表 [fd2] ──→ 系统打开文件表项 ② ──→ (同一个 inode)| 层级 | 内容 | f1 / f2 是否共享 |
|---|---|---|
| 磁盘 inode | 文件元数据 + 数据块指针 | 共享(硬链接定义) |
| 内存 inode 表 | 进入内存后的 inode 副本 | 共享(同一磁盘 inode 只装入内存一次) |
| 系统打开文件表 | 每次 open 一项,含读写指针、打开模式 | 不共享(两次独立 open 各建一项) |
| 用户进程打开文件表(fd 表) | fd → 系统打开文件表项 的索引 | 不共享(各进程独立) |
逐条核对:
| 命题 | 判定 | 说明 |
|---|---|---|
| Ⅰ 读写指针位置相同 | ✗ | 两个进程独立 open,系统打开文件表项独立,读写指针各自一份。一个进程 read 不影响另一个 |
| Ⅱ 共享同一内存 inode | ✓ | 硬链接的核心:磁盘 inode 共享,内存 inode 表同一个 inode 只装一次 |
| Ⅲ fd1、fd2 各指向自己的用户打开文件表项 | ✓ | 每个进程的 fd 表独立 |
关键区分:硬链接 vs dup() 复制 fd——硬链接共享 inode 但指针独立;dup 共享系统打开文件表项 → 指针同步。两者层级不同,不要混。
最终答案是 B。