前言
这段时间毕业、工作入职占用了大量时间,很久没有跟进了,现在在公司培训了,希望自己的未来会更好!!
这章主题跟文件目录相关,pwd命令就是能输出现在所处在的目录的路径
4.1 概念
文件包含数据,而目录是文件的列表。而pwd命令则可以显示出你在目录中的位置。
要编写pwd命令必须要了解文件和目录是如何组织和存储的。首先查看文件系统的外在特征,再分析内部结构,最后学习相应的系统调用的功能和使用方法。
4.2 从用户刊文件系统
硬盘中的文件组成一颗目录树,如图所示:
跟着书中的实验,了解相关命令的结果:
实验中可以了解mkdir创建、rmdir删除目录,mv可以用于重命名;
第二个实验比第一个复杂,作者故意绕的,结果如图:
在实验中ln命令是建立了一个硬链接,相当于是源文件的副本,但是不占用额外的空间,对其操作会直接影响源文件中的内容。
实验中x和xlink都是链接,链接是指向文件的一个指针。
文中还介绍了其他的命令,可以自行练习。
目录树的深度几乎没有限制,但是,有可能所建的目录树太深以置超过许多命令允许的范围。我已经创建了测试代码并bash运行了
输入ls -R后会出现目录名称太长显示不出
尴尬的是我看错了,我输入rm -rf deep-well后删除了文件,如果rm -r不能删除的答案就是rm -rf
4.3 文件系统的内部结构
第一层抽象:磁盘->分区
第二层抽象:磁盘->块序列
扇区是磁盘的基本存储单元
第三层:从块序列到三个区域的划分
文件系统可以用来存储文件内容、文件属性和目录,unix使用简单的方法将磁盘分为三部分
数据区:用于存放文件内容;
i-节点表:用于存放文件属性
超级块:用于存放文件系统本身的信息
其中任一部分都是很多有序磁盘块组成。
文件系统的实现
创建一个文件会发生什么?
在命令行输入who > userlist
会新建一个文件userlist,文件创建必然存放在磁盘中,所以u文件系统必然发生改变,在创建、删除文件时文件系统三个部分必然发生,如图:
创建文件的4个主要操作:
1、存储属性:内核先找到一个空的i-节点,将文件属性记录
2、存储数据:假设新文件需要3个存储块,内核则会从自由块列表找出3个自由块,将数据存放在这3个数据块中
3、记录分配情况
4、将文件名添加到目录
目录的工作过程
目录是一种包含了文件名字列表的特殊文件,一个包含i-节点号和文件名的表,使用ls -1ia(是数字1,不是l)(-i是输出i-节点号,1意思是每行列出一个文件)
可以看到第一列是i-节点号.
书中的下个例子没有,我自己弄了个,链接文件的i-节点号是一样的
cat命令的工作原理
输入cat userlist,会发生什么
1、在目录中寻找文件名,找到i-节点号
2、定位i-节点并读取他的内容,内容中有数据块编号的列表
3、访问存储文件内容的数据块
而大文件的话,无法记录那么多的编号,则使用间接块的方法,详细的读写逻辑算法这边还不用纠结,大概方法如图(文中有比较详细的创建间接块的解释):
4.4理解目录
对于用户,目录是文件名的列表,对于unix系统则是被命名的指针的列表
4.5编写pwd
pwd命令可以知道本目录地址,根据上面的知识我们也应该知道,现目录就是"."的i-节点,必然通过这个i-节点继续向上追溯,直到树顶
(1)得到"."的i-节点号,称为n
(2)使用chdir ..
(3)利用n号找到名字,存储(使用opendi、readdir、closedir)
(4)重复直到树顶
又因为树顶的"."和".."指向自身,判断"."和".."的i-节点值相同代表树顶;要么迭代方式一一存放目录名,但是操作麻烦,可以使用递归直接打印目录名称。
我自己编写了个pwd,跟书上代码有点不一样,逻辑差不多,以上传gitee,多使用man命令,很有用