Unix/Linux编程:文件、目录的工程过程&cat工作原理

创建一个文件的过程

文件的内容和属性分区存放的想法看起来很简单,但实际上它是如何工作的呢?创建一个新文件时又发生什么?考虑如下命令:

$ who > userlist

当这个命令完成时,文件系统中增加了一个存放命令who输出内容的新文件:

$ cat userlist 
oceanstar :0           2021-05-24 18:06 (:0)
oceanstar pts/3        2021-05-26 09:57 (:0)

文件有内容和属性,内核将文件内容存放在数据区,文件属性存放在i-节点,文件名存放在目录:
在这里插入图片描述
创建一个新文件的四个主要步骤如下:

(1) 存储属性

文件属性的存储:内核先找到一个空的i-节点。上面内核找到i-节点47。内核把文件的信息记录在其中

(2)存储数据

文件内容的存储:假设该新文件需要三个存储磁盘块,那么内核从自由块的列表中找出三个自由块。上面它找到块627、200、992。内核缓冲区的第一块数据复制到块627,下一块数据复制到块200,最后一个数据复制到块992

(3)记录分配情况

文件内容按照顺序放在块627、200和992中。内核在i-节点的磁盘分布区记录了上述的块序列。磁盘分布区是一个磁盘块序号的列表,这三个编号放在最开始的三个位置

(4)添加文件名到目录
新文件的名字是userlist。Unix如何在当前的目录中记录这个文件?很简单。内核将入口(47,userlist)添加到目录文件。文件名和i-节点号之间的对应关系将文件名和文件的内容以及属性链接了起来

目录的工作过程

目录是一种包含了文件名字列表的特殊文件。不同版本的Unix目录的内部结构不同,但是它们的抽象模型总是一致的------一个包含i-节点号和文件名的表
在这里插入图片描述

(1)探讨目录内部:

$ ls -1ia .
607245955 .
   719879 ..
134680609 logs
607245974 thermal_detection

输出的是文件名和对应的i-节点号。 比如,当前目录的i节点号是607245955 ,这意味着有关大小、文件所有者、组等各项关于当前目录的信息存放在i-节点号中的编号为607245955 的结构中

(2)指向同一文件的多重链接:
在这里插入图片描述
上面,xfer.log和transfers的两个文件都指向i-节点号183,即,这两个文件都指向同一个i-节点。i-节点实际上代表了一个文件(i-节点包含了文件的属性和数据块的列表)。也就是说,xfer.log和transfers是同一个文件的两个别名

上面的...都i-节点号都是2,也就是说...指向同一个目录。大多数情况下,当前目录和父目录是不同的,但是根目录是例外:当前Unix命令mkfs创建了一个文件系统,mkfd将根目录的父目录指向自己

cat命令的工作原理

当读取一个文件时:

$ cat userlist 
oceanstar :0           2021-05-24 18:06 (:0)
oceanstar pts/3        2021-05-26 09:57 (:0)

是怎么工作的呢?

(1)在目录中寻找文件名

文件名存储在目录文件中。内核在目录文件中寻找包含字符串oceanstar 的记录。oceanstar 所在的记录包含编号为47的i-节点号

在这里插入图片描述
(2)定位i-节点号47并读取器内容
内核在文件系统中的i-节点区域找到i-节点47。定位一个i-节点可能需要一些简单的计算,所有的i-节点号大小相同,每个磁盘块都包含相同数量的i-节点。为了提高访问效率,内核有可能将i-节点置于缓冲区中。i-节点包含数据块编号的列表

(3)访问存储文件内容的数据块

通过以上调用构成,内核已经可以知道文件内容存放在哪些数据块上,以及它们的顺序。由于cat不断的调用read函数,使得内核不断将字节从磁盘复制到内核缓存区,进而到达用户空间

所有从文件读取数据的命令,比如,cat、cp、more、who等,都是将文件名传给open来访问文件内容,对open的每次调用都是先在目录中寻找文件名,然后根据目录中的i-节点号获得文件的属性,最终找到文件的内容。

假如open一个没有读或者写权限的文件时:内核首先根据文件名找到i-节点号,然后根据i-节点号找到i-节点。在i-节点中,内核找到文件的权限位和拥有者的用户ID。如果权限位设置你的用户ID对文件没有访问权限,则open返回-1并将errno置为EPERM。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值