关于Unix/Linux之Inode之我见----------Unix环境高级编程--目录、文件

     在读第四章目录和文件的4.14节中,关于目录的i节点描述以及目录的描述,觉得有点纷乱,通过查资料以及自己的理解,写这篇博文。

先把图上来


关于Unix/Linux之Inode之我见----------Unix环境高级编程--目录、文件_第1张图片

关于Unix/Linux之Inode之我见----------Unix环境高级编程--目录、文件_第2张图片


这两个图,刚开上去有点乱。而且第一感觉分辨不出来什么。我来写一下我对这两个图的认识。

一个磁盘分成一个或者多个分区,就是第一附图第一行的意思。然后,每个分区包含一个文件系统(如图上所说),我们主要分析柱面组(0,n)。没个柱面组前一部分信息不做深究。主要看i节点(i节点数组)和数据块部分(图中所说的)。我们假设成为途中的数据块为数据区(因为数据和目录在用户看来是区分开的,但是对于计算机文件系统来说,都是数据,所以,在概念上总是容易混淆,姑且成为数据区吧,第一部分为inode数组)。

第一部分是i节点数组,存放着所有该柱面组中的inode数据。

一、创建普通文件

        其实,当你创建一个文件的时候,按照书中的意思,是先在数据区划分一个数据块(称他为目录块(目录项)),并且为该数据块(目录项)分配一个inode(主要是inode 编号),存放到inode数组中。然后,为该文件分配实际数据块(存放文件内容的),假如需要3个数据块,则为这些数据块分配一个inode(包含inode编号,以及包含该文件的所有数据块的地址列表),将其放入inode数组中,然后再目录块中,存数数据:“inode编号(实际数据存放):文件名"。这样,每次读取文件的时候,过程如下:

                    文件名----(通过目录项)---->inode编号----(通过inode)----->得到文件的地址(数据块号数组)---->读取文件

       当在不更换文件系统的情况下,修改文件名(通常是mv命令),该文件的内容数据并没有发生移动,而是重新建立了一个指向文件inode的心目录项,并解除与旧目录项的连接。

       而图中会出现两个目录项连接到一个数据inode,这将增加数据inode的链接数。当连接数不为0时,删除删除文件一次,等于释放了一个链接,而不是物理的从磁盘上删掉该文件。这个涉及到硬链接以及符号链接,一会再讲。

 二、创建目录文件

       mkdir   testdir

       上边的命令是在linux/unix中创建一个目录的shell命令。我们还来分析一个柱面区的inode数组和数据区。

       当创建一个目录时,仍然是现在数据区分使用一个空数据块,然后对该数据块创建一个inode数组,并且放入到inode数组中。该目录块(目录项)的初始数据如下:

               1、本目录目录名和inode编号映射([2549:.],”.“代表本目录在本目录内部的称谓,除了本目录,必须使用testdir代表本目录名)

               2、父目录目录名和inode编号映射[1267:..](父目录块的inode编号,”..“代表父目录)

       这就是为什么在shell中,输入   cd ..可以返回到上一层目录的缘故。

       任何一个叶目录项,的连接数总是2。而非叶目录的链接数至少为3(至少包含一个目录)。父目录的每一个子目录,都会让父目录的链接数加一。

      以上是文件和目录的inode的认识。


三、硬链接和软连接

      关于Unix/Linux之Inode之我见----------Unix环境高级编程--目录、文件_第3张图片

这里参考的文章连接:http://blog.csdn.net/feiyinzilgd/article/details/5609157

你会发现上图中,目录项A和目录项B的i节点指向同一个存储区,其中这个存储区存放的是printf("ha")的数据。

也就是意味着helloA.c和helloB.c的内容是一样的。而helloC.c创建了一个符号链接,只是相当于建立了一个引用,引用了目录项B,而没有创建自己的目录项去指向源文件的inode节点,所以,源文件的inode的链接数没有把HelloC.c算在内,所以,一旦目录项B删除,则符号链接就会失效。

硬链接、符号链接的概念 

         硬链接  ln -d

         符号链接 ln -s。

  helloA.c和helloB.c 的关系使用如下命令:

[cpp]  view plain copy print ?
  1. #ln -d  helloA.c  helloB.c  

这样,就建立了helloA.c到helloB.c的硬链接

该链接属于硬链接,如果删掉源文件helloA.c(实际是删除helloA所对应的目录项),那么磁盘上数据文件时不会删除的。因为源文件的i节点上记录了该文件的硬链接数。只有硬链接数是0的时候(即同时删除helloA和helloB),删除文件名的时候,该数据在磁盘上才会删除。

例如,我们使用命令:

[cpp]  view plain copy print ?
  1. # rm  -rf  helloA.c  

helloB.c同样可以正常使用,其内容就是printf("ha");

使用如下的命令:

[cpp]  view plain copy print ?
  1. #ln -s  helloB.c  helloC.c 

我们就创建了符号链接,符号链接其实是被链接文件的目录项的引用。

当源文件helloB.c删除之后,其实删除的是helloB的目录项,其实际磁盘数据文件还在,但helloC.c无法使用。

符号链接包含了一个文件名的路劲,如果这个文件名被删除,这符号链接自然就不能正常工作了。

     PS:本人水平有限,理解能力也有限,所提的观点仅供参考

 

你可能感兴趣的:(关于Unix/Linux之Inode之我见----------Unix环境高级编程--目录、文件)