目录的操作
这一节内容不多,但它是理解 4.1.6 那条”删除文件看父目录权限”的机制来源:几乎所有对文件的管理动作,落到实处都是在改目录。
机制
五种目录操作
搜索:当用户要使用一个文件时,系统要根据文件名搜索目录,找出该文件对应的目录项。这是最频繁的目录操作,也是 4.2.4 要优化的对象。
创建文件:当创建一个新文件时,需要在其所属目录中增加一个目录项。
删除文件:当删除一个文件时,需要在目录中删除相应的目录项。
显示目录:用户可以请求显示目录的内容,如显示该目录中的所有文件名及属性。
修改目录:某些文件属性保存在目录中,因而这些属性的变化需要修改相应的目录项(如文件更名)。
这五种操作对应的权限
把上面五条与目录权限对照,4.1.6 的那组结论就完全是推论了:
搜索要读目录项来比对文件名,但它是沿路径向下走的动作,需要的是目录的 x。显示目录要列出全部内容,需要的是 r。创建、删除、修改(更名)都在改目录项表,需要的是 w。
这解释了一个常被误解的现象:一个目录若只有 x 没有 r,用户能访问其中已知路径的文件,却无法列出里面有什么。这在实际系统中被用作一种弱保护手段。
边界
目录操作与文件操作是两套
同一个动作名,作用对象可能完全不同,这是本节最需要分清的一点:
“删除”作为文件操作(4.1.3)指的是回收该文件的数据块;“删除”作为目录操作指的是抹掉目录中的那个目录项。
一次 delete 系统调用实际上两件都做,但检查权限时看的是目录操作那一半——因为被修改的是目录文件的内容。
同理,“更名”完全不触及文件本身:它只改目录项里的名字字段,文件的 inode、数据块、内容一个字节都不动。所以更名是一个极快的操作,无论文件多大。
显示目录不等于读文件
用户程序不能像读普通文件那样直接 read 一个目录(这一限制在 4.1.1 讲目录文件时提过)。系统提供专门的调用来读目录项,原因是目录项的格式是文件系统的内部约定,交给用户程序自由解释既不安全,也无法在不同文件系统之间通用。
这也是”目录文件”被单独归为一类的实际后果:它的内容由系统解释,而不是由应用解释。
对照速查
| 目录操作 | 做什么 | 需要目录的哪种权限 |
|---|---|---|
| 搜索 | 按文件名找目录项(最频繁) | x |
| 显示目录 | 列出全部文件名及属性 | r |
| 创建文件 | 增加一个目录项 | w(+ x) |
| 删除文件 | 删除相应目录项 | w(+ x) |
| 修改目录 | 改目录项中的属性(如更名) | w(+ x) |
| 动作 | 改了什么 |
|---|---|
| 更名 | 只改目录项的名字字段,文件本体不动 |
| 删除 | 目录项 + 数据块,但权限查的是目录 |
考点
- 五种目录操作:搜索、创建文件、删除文件、显示目录、修改目录
- 搜索是最频繁的目录操作,是目录实现要优化的对象
- 更名不触及文件本体,与文件大小无关
- 只有
x没有r的目录:能穿过,不能列出
链接
- 🏠 返回总览:操作系统第 4 章:文件管理总览
- ⬅️ 上一节:4.2.1 目录的基本概念
- ➡️ 下一节:4.2.3 目录结构
- 🔗 权限含义见 4.1.6 文件保护
- 📖 名词库:第 4 章名词库