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 的含义(进程打开文件表的索引)
  • 🔥 打开计数的作用(最后一个关闭时才回写和释放)

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

真题练习

相关真题(7题)

2023Q31选择题2分

关闭文件:释放内存中的索引节点副本,不删除外存inode

2022Q29选择题2分

文件操作:open()系统调用负责按文件名查找并打开文件

2021Q24选择题2分

共享文件:系统打开文件表中只有一个F的属性表项

2017Q31选择题2分

硬链接:共享inode,不同进程打开有各自的读写指针

2014Q29选择题2分

打开文件:将FCB/inode读入内存,不读文件内容

2013Q23选择题2分

删除文件:删除目录项、FCB和释放缓冲区,但不会删除所在目录

2012Q28选择题2分

read系统调用:需要文件描述符而非文件名,缺数据会阻塞,会切换到内核态