目录的操作

这一节内容不多,但它是理解 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 的目录:能穿过,不能列出

链接