Appearance
题目
在一个文件被用户进程首次打开的过程中,操作系统需要做的是( )。
错因
A
直觉觉得"打开文件 = 把内容读出来",毕竟"打开"两个字听起来像把书翻开。但 OS 的 open() 设计是懒加载——文件可能上 GB,谁也不会一打开就读完整内容。open 只把元数据(FCB / inode)拿进内存,真正的数据要等 read() 调用时才按需读。
C
修改读写权限是chmod 这种独立操作,跟 open 完全不沾边。打开文件不会改它的权限——OS 只是检查权限位看用户能不能访问,访问通过就建打开文件项,不通过就拒绝;不修改任何东西。
D
混了"缓冲区指针"和"文件描述符"两个概念。open 返回的是文件描述符 fd(用户打开文件表里的一个索引整数,比如 3),不是缓冲区指针。"缓冲区"是用户调用 read 时自己分配的一段内存(read(fd, buf, n) 里的 buf),由用户传给 OS,不是 OS 给用户的。
总解析
文件打开的核心是建立"用户能用 fd 找到 inode"的路径,OS 在 open 时做的事按顺序:
| 步骤 | 操作 | 为什么 |
|---|---|---|
| ① 路径解析 | 按目录链找到文件的 FCB / inode | 通过路径名定位元数据 |
| ② FCB 读入内存 | 把 FCB / inode 从磁盘搬到内存(系统打开文件表) | 每次访问都要查它(找数据块、检查权限),不能每次都走磁盘 |
| ③ 建用户打开文件表项 | 在进程的打开文件表里加一行,指向系统打开文件表项 | 给该进程一个 fd 索引 |
| ④ 返回 fd | 把进程内表项下标返回给用户 | 用户后续 read/write 用 fd |
关键:FCB / inode 是文件的元数据(大小、块指针、权限、时间戳)。文件内容要读多少由后续 read 决定,open 只搬元数据,不搬内容。
逐项核对:
- A:把文件内容读入 → 错(打开不读内容)
- B:把 FCB 读入内存 → ✓ 正是步骤 ②
- C:改 FCB 的读写权限 → 错(open 只查不改)
- D:返回缓冲区首指针 → 错(返回的是 fd 而不是指针,且缓冲区由用户在 read 时自己提供)
最终答案是 B。