此文着重介绍系统是如何表示目录的以及pwd命令的编写。
我们都知道Unix将磁盘分为三部分:超级块(superblock),节点表(inode table)以及数据区。超级块中记录文件系统本身的结构信息。节点表中记录文件的属性,文件系统中每个文件在表中都至少有一个i-节点,表中每个节点的大小相同。数据区就是文件数据真实的存储位置。
简要介绍磁盘知识后,我们来谈谈目录。在Unix中,目录是包含了文件名字列表的特殊文件,其抽象模型是一个包含i-节点号和文件名的表。所以一个目录的内容有两个部分:一个i-节点表和文件名表,其相互对应。对于文件来说,目录是找到该文件的一个索引(链接),本质上就是负责记录文件i-节点表与文件名的对应关系(一个文件可能对应好多个i-节点)。对于open、cat、cp等命令,都是通过在目录中寻找目的文件名,然后根据对应关系获取i-节点号以获取文件属性,最终获取文件内容来实现的。
假设目录demodir中有一个文件y,y文件对应的i-节点号是491。从系统角度来看,目录中有一个包含文件名y和i-节点号为491的入口,也可以说目录demodir中有一个指向i-节点号为491的链接,这个链接所附加的文件名为y。
说来说去这么绕,书上有一句结论概括地很好:目录包含的是文件的引用,每个引用被成为链接。文件的内容存储在数据块,文件的属性被记录在一个被称为i-节点的结构中,i-节点的编号和文件名存储在目录中。就像我前面说的,目录本质上是记录对应关系。
了解了pwd的内核属性后,我们来实现一下pwd。
此程序中使用递归语句实现,从当前目录不断循环深入直到”.”与”..”的i-节点号相同,