Appearance
题目
若多个进程共享同一个文件 F,则下列叙述中,正确的是( )。
错因
A
把"共享文件"听成了"只读共享"。共享只是说允许多进程同时打开同一个文件,至于以什么方式打开(读 / 写 / 追加)是各进程自己 open 时挑的,OS 不会因为别人也开了就强制降级到只读——只读共享是一种使用约定,不是共享的硬性条件。
C
把两层表搞混了:用户打开文件表是进程私有的,里面记的是"我打开 F 时拿到的访问权限、当前读写指针、文件描述符"——每个进程独立维护,因此内容通常不同(哪怕只是读写指针不同)。"内容相同"的是它们指向的下一层——系统打开文件表里那个共享表项。
D
把关闭等同于了"完全销毁"。关闭只是当前进程不再用 F 了,系统打开文件表项的打开计数减 1;只要还有别的进程开着 F、计数没归零,表项就得留着——它正是多进程共享 F 时的"汇合点"。计数归零(最后一个用户也关掉了)才会真的删除该表项。
总解析
打开文件表分两层维护,是为了让"多进程共享"这件事说得清:
| 表 | 归属 | 每条记录什么 | 同一文件被多进程打开时 |
|---|---|---|---|
| 用户打开文件表 | 进程私有(每进程一份) | 文件描述符、访问模式、当前读写位置、指向系统表的指针 | 每个进程一条,内容通常不同(读写指针、模式都可能不同) |
| 系统打开文件表 | 全系统共用(OS 内核一份) | 文件主属性、内存 inode 副本、打开计数、共享读写位置(部分 OS) | 全系统只有一条,所有打开 F 的进程的用户表项都指向它 |
逐项过:
- A:共享 ≠ 只读,各进程仍可按需以读 / 写 / 读写方式打开,错。
- B:多进程共享 F 时,系统打开文件表里有且仅有 F 这一条共享记录,正是这层表的存在意义,对。
- C:用户打开文件表项各进程独立维护,文件描述符、读写指针、访问模式都可能不同,错。
- D:关闭只是把系统表项的打开计数减 1;计数归零时才真正删除该表项,错。
最终答案是 B。