精简版 · 小杯2026-08 冻结,已停止更新(发布前修订了 4 处已知错误)。后续勘误与新增内容只在正式版。看正式版(中杯)→
Skip to content

文件的操作 ​

考情分析 ​

文件操作属于文件管理基础,在 408 真题中以选择题为主,考查打开文件表的层次结构、文件描述符的含义等。属于 🔥🔥 中高频考点。

用户每天都在"打开文件、读写、关闭",但这几步背后涉及目录搜索、权限检查、打开文件表的管理——搞清楚这条链路,很多选择题就不会踩坑。

文件操作概述 ​

操作系统通过一组系统调用为用户提供文件操作接口:

创建与删除 ​

创建文件 create(filename, mode) ​

  1. 在目录中检查文件名是否已存在
  2. 为新文件分配一个 FCB(或 inode)
  3. 在目录中添加新的目录项 (filename, inode号)
  4. 分配必要的外存空间(也可能延迟到首次写入时)

删除文件 delete(filename) ​

  1. 在目录中查找文件名对应的目录项
  2. 回收该文件占用的外存空间
  3. 删除该目录项
  4. 如果使用 inode,则引用计数减 1,计数为 0 时回收 inode

打开与关闭 ​

打开文件 fd = open(filename, mode) ​

打开文件是建立进程与文件之间联系的过程,是后续读写操作的前提。

执行步骤:

  1. 在目录中搜索文件名,找到对应的 FCB/inode
  2. 检查访问权限(mode 是否合法)
  3. 在系统打开文件表中查找该文件是否已被打开
    • 若已打开:打开计数 +1
    • 若未打开:将 FCB/inode 信息复制到系统打开文件表
  4. 在进程打开文件表中分配一个空闲表项,指向系统打开文件表中对应条目
  5. 返回进程打开文件表的索引,即文件描述符 fd

这就像去图书馆借书——第一次去前台登记(open)拿到借书卡号(fd),之后凭卡号直接借还,不用每次都报书名让管理员翻目录。

两级打开文件表 ​

进程 A 的打开文件表          系统打开文件表
┌────┬──────────┐       ┌────┬──────────┬───────┐
│ fd │ 系统表索引│       │ 索引│ FCB 信息  │打开计数│
├────┼──────────┤       ├────┼──────────┼───────┤
│  0 │    →     │──────►│  3 │ file.txt │   2   │
│  1 │    →     │──┐    │  5 │ data.bin │   1   │
└────┴──────────┘  │    └────┴──────────┴───────┘
                   │         ▲
进程 B 的打开文件表  │         │
┌────┬──────────┐  │         │
│  0 │    →     │──┘         │
│  1 │    →     │────────────┘
└────┴──────────┘
表作用包含字段
进程打开文件表每个进程私有fd、系统表索引、读写指针、访问模式
系统打开文件表全系统共享FCB/inode 信息、打开计数、文件锁

两级表的关系类似于"个人通讯录"和"公司员工花名册"——每个人的通讯录里记着自己常联系的同事编号,但详细信息统一查花名册。

关闭文件 close(fd) ​

  1. 将进程打开文件表中 fd 对应的表项清除
  2. 系统打开文件表中对应项的打开计数 -1
  3. 若打开计数减为 0,回收该系统表项,必要时将修改过的 FCB 写回磁盘

读与写 ​

读文件 read(fd, buffer, size) ​

  1. 根据 fd 找到进程打开文件表中的表项
  2. 根据当前读指针位置和文件的物理结构,定位到磁盘块
  3. 将数据从磁盘块读入内存 buffer
  4. 更新读指针位置

写文件 write(fd, buffer, size) ​

  1. 根据 fd 定位文件
  2. 根据当前写指针位置,将 buffer 中的数据写入磁盘块
  3. 如果需要,分配新的磁盘块
  4. 更新写指针位置和文件大小

文件指针(读写位置) ​

文件指针记录了文件当前的读写位置。

  • 存放在进程打开文件表中(不在系统打开文件表中)
  • 每个进程独立维护自己的读写位置
  • seek(fd, offset, whence) 可以修改文件指针位置

文件指针的存储位置

「文件读写指针存放在哪里?」是选择题常见陷阱。答案是进程打开文件表中,而不是 FCB/inode 中,也不是系统打开文件表中。因为不同进程打开同一个文件时,各自的读写位置是独立的。

本文对应考点 ​

  • 🔥🔥🔥 两级打开文件表的结构与区别
  • 🔥🔥🔥 文件读写指针存放在进程打开文件表中(选择题陷阱)
  • 🔥🔥 open 操作的执行过程
  • 🔥🔥 文件描述符 fd 的含义(进程打开文件表的索引)
  • 🔥 打开计数的作用(最后一个关闭时才回写和释放)

文件能被操作,也就能被滥用——下一篇来看操作系统如何保护文件不被越权访问。

真题练习 ​