Appearance
文件的操作
考情分析
文件操作属于文件管理基础,在 408 真题中以选择题为主,考查打开文件表的层次结构、文件描述符的含义等。属于 🔥🔥 中高频考点。
用户每天都在"打开文件、读写、关闭",但这几步背后涉及目录搜索、权限检查、打开文件表的管理——搞清楚这条链路,很多选择题就不会踩坑。
文件操作概述
操作系统通过一组系统调用为用户提供文件操作接口:
创建与删除
创建文件 create(filename, mode)
- 在目录中检查文件名是否已存在
- 为新文件分配一个 FCB(或 inode)
- 在目录中添加新的目录项
(filename, inode号) - 分配必要的外存空间(也可能延迟到首次写入时)
删除文件 delete(filename)
- 在目录中查找文件名对应的目录项
- 回收该文件占用的外存空间
- 删除该目录项
- 如果使用 inode,则引用计数减 1,计数为 0 时回收 inode
打开与关闭
打开文件 fd = open(filename, mode)
打开文件是建立进程与文件之间联系的过程,是后续读写操作的前提。
执行步骤:
- 在目录中搜索文件名,找到对应的 FCB/inode
- 检查访问权限(mode 是否合法)
- 在系统打开文件表中查找该文件是否已被打开
- 若已打开:打开计数 +1
- 若未打开:将 FCB/inode 信息复制到系统打开文件表
- 在进程打开文件表中分配一个空闲表项,指向系统打开文件表中对应条目
- 返回进程打开文件表的索引,即文件描述符 fd
这就像去图书馆借书——第一次去前台登记(open)拿到借书卡号(fd),之后凭卡号直接借还,不用每次都报书名让管理员翻目录。
两级打开文件表
进程 A 的打开文件表 系统打开文件表
┌────┬──────────┐ ┌────┬──────────┬───────┐
│ fd │ 系统表索引│ │ 索引│ FCB 信息 │打开计数│
├────┼──────────┤ ├────┼──────────┼───────┤
│ 0 │ → │──────►│ 3 │ file.txt │ 2 │
│ 1 │ → │──┐ │ 5 │ data.bin │ 1 │
└────┴──────────┘ │ └────┴──────────┴───────┘
│ ▲
进程 B 的打开文件表 │ │
┌────┬──────────┐ │ │
│ 0 │ → │──┘ │
│ 1 │ → │────────────┘
└────┴──────────┘| 表 | 作用 | 包含字段 |
|---|---|---|
| 进程打开文件表 | 每个进程私有 | fd、系统表索引、读写指针、访问模式 |
| 系统打开文件表 | 全系统共享 | FCB/inode 信息、打开计数、文件锁 |
两级表的关系类似于"个人通讯录"和"公司员工花名册"——每个人的通讯录里记着自己常联系的同事编号,但详细信息统一查花名册。
关闭文件 close(fd)
- 将进程打开文件表中 fd 对应的表项清除
- 系统打开文件表中对应项的打开计数 -1
- 若打开计数减为 0,回收该系统表项,必要时将修改过的 FCB 写回磁盘
读与写
读文件 read(fd, buffer, size)
- 根据 fd 找到进程打开文件表中的表项
- 根据当前读指针位置和文件的物理结构,定位到磁盘块
- 将数据从磁盘块读入内存
buffer - 更新读指针位置
写文件 write(fd, buffer, size)
- 根据 fd 定位文件
- 根据当前写指针位置,将
buffer中的数据写入磁盘块 - 如果需要,分配新的磁盘块
- 更新写指针位置和文件大小
文件指针(读写位置)
文件指针记录了文件当前的读写位置。
- 存放在进程打开文件表中(不在系统打开文件表中)
- 每个进程独立维护自己的读写位置
seek(fd, offset, whence)可以修改文件指针位置
文件指针的存储位置
「文件读写指针存放在哪里?」是选择题常见陷阱。答案是进程打开文件表中,而不是 FCB/inode 中,也不是系统打开文件表中。因为不同进程打开同一个文件时,各自的读写位置是独立的。
考研高频考点
- 🔥🔥🔥 两级打开文件表的结构与区别
- 🔥🔥🔥 文件读写指针存放在进程打开文件表中(选择题陷阱)
- 🔥🔥 open 操作的执行过程
- 🔥🔥 文件描述符 fd 的含义(进程打开文件表的索引)
- 🔥 打开计数的作用(最后一个关闭时才回写和释放)
文件能被操作,也就能被滥用——下一篇来看操作系统如何保护文件不被越权访问。