文件--索引节点

POSIX没有强制磁盘上的文件采取任何特定的表示方法,但是传统的UNIX文件都是按照改进的树状结构来实现的。目录项中包含一个文件名 和一个定长结构的引用(索引节点)。索引节点包含与文件长度、文件位置、文件所有者、创建时间、最后访问时间、最后修改时间、文件权限有关的信息。如图1所示:
                                                                  图 1
 
除了基本信息,还包含指向文件中前几个数据块的指针。如果文件很大,就需要使用到间接指针了。
 
单级间接指针是一个指向指针块的指针,而指针块中的指针是指向附加数据块的;
二级间接指针是一个执行间接知真块的指针;
三级间接指针块包含了一个指向二级间接指针块的指针。

文件系统在磁盘中存储形式如图1所示:

图1. 磁盘中文件系统存储形式

  其中,文件属性及指向文件中所存储数据的指针存储于i-nodes中,文件名、文件中所存储的数据、该文件所对应的i-node编号存储于data blocks中,数据单独存储。如图2所示:

图2. 磁盘中文件存储形式

  i-node中包含文件类型、文件访问权限、文件大小、指向文件中所存储数据的指针、文件链接数等信息。当使用link函数使得一个文件指向链接至该文件(即两个文件具有相同的i-node值)时,我们称之为硬链接,此时i-node中文件链接数被加1。需要删除文件时,可使用unlink函数将目标路径与文件的链接中断(使该路径文件的i-node值被清空,文件被删除),注意,此时仅有目标路径文件被删除,该文件所对应的i-node中若链接数不为0,则代表有其他文件仍指向该文件,i-node中链接数将减1,其余信息保持不变。当使用symlink函数为目标文件建立符号链接时,将新建一个i-node,文件类型为symbolic link file,文件长度为目标文件名长度,文件数据指针与目标文件i-node中数据指针相同。

目录

  目录文件在文件系统中的存储形式与常规文件类似。目录中所包含的文件名及其i-node值存储在目录文件块中。其存储形式如图3所示:

图3. 磁盘中目录文件存储形式

硬链接和软链接

一下内容出自:http://keren.blog.51cto.com/720558/170979/
硬链接本身就是一个目录项,(比如文件名+索引节点号),可以将文件名与文件的位置关联起来;
符号链接也称软链接,是指存储了一个字符串的文件。这个字符串可以在路径名解析的过程中,用于修改路径名。
 
----------------------------------------------------
  假设文件是用索引节点来表示的
----------------------------------------------------
 
目录项对应于单个链接,但是一个索引节点可能有几个链接的目标(对应几个目录项),因此索引节点中包含一个对链接到索引节点的链接数的计数。当用open()创建一个新的文件时,操作系统就会创建一个新的目录项,并分配一个空闲的索引节点来表示该文件。
                                                       图 1
图1显示的就是/dirA下的name1文件的目录项,索引节点为12345,有一个链接,它的第一个数据块为23567。 文件很小,所有内容都包含在一个块中。
 
(1)创建一个硬链接
可以使用命令ln或者函数link()为文件创建一个链接。
 
#include <unistd.h>
int link( const char *path1, const char *path2 );
 
上述操作为path1指定的一个已经存在的文件(比如/driA/name1)创建一个新的目录项,这个文件位于path2指定的目录下(比如/driB/name2);并增加相应的索引节点链接计数,不再使用额外的磁盘空间。
如图2:
                                                 图 2
(2) 创建一个符号链接
符号链接是一个包含了另一个文件或目录名字的文件。引用符号链接的名字会使操作系统去定位对应于那个链接的索引节点,知道最终遇到一个硬间接和一个真正的文件为止。如果过了一段时间,系统没有找到文件,则放弃并返回ELOOP错误。
 
使用ln命令带选项-s 或者函数symlink(),都可以创建符号链接。
 
#include <unistd.h>
int symlink ( const char *path1, const char *path2);
 
这里path2是新创建的链接,新链接指向path1 。如图3:
                                                                       图 3
 
这里,符号链接使用了一个新的索引节点(13579),该索引节点包含了说明它是一个符号链接的信息。符号链接至少需要一个数据块(如15213),数据块中包含了/dirB/name2要链接的文件名称,这里即为/dirA/name1。
 

硬链接和软链接的区别

符号链接符号链接也称为软链接,它是包含在文件中的路径名。当系统遇到符号链接
时,它沿着符号链接提供的路径名前行,然后继续沿着符号链接后面的任何其余路径
前行。如果路径名以一个 / 开始,则系统返回到 /(“根”)目录,并从该目录开
始沿着路径前行。如果路径名未以 / 开始,则系统返回到前一级目录,并从那个目
录开始沿着符号链接中的路径名前行。 

硬连接指通过索引节点来进行的连接  
 1.硬链接文件和原文件指向同样的数据,两者就像科隆一样,inode号也相同,当
删除原文件时,硬链接文件仍然存在有效。但硬链接文件不同于文件的复制。应该说
硬链接文件的产生只是原文件所在目录文件的内容发生改变,原文件的数据并没有得
到复制,而复制文件,磁盘上有两份数据。简单说,硬链接就是一个类似于别名的概
念。当原来的名字没有了,别名照样可以使用。  
2.软连接和windows系统的快捷方式含义一样,不做多的解释。软链接和原文件的
inode不同,该文件的内容是指向原文件的路径信息。软链接就好像是指针一样。而
硬链接就是引用。
 

UNIX中的文件和目录相关推荐

  1. python显示目录中的文件_Python中的文件和目录操作实现

    Python中的文件和目录操作实现 对于文件和目录的处理,虽然可以通过操作系统命令来完成,但是Python语言为了便于开发人员以编程的方式处理相关工作,提供了许多处理文件和目录的内置函数.重要的是,这 ...

  2. linux防止文件被复制,技术|如何在 Linux 系统中防止文件和目录被意外的删除或修改...

    有时,我会不小心的按下 SHIFT+DELETE来删除我的文件数据.是的,我是个笨蛋,没有再次确认下我实际准备要删除的东西.而且我太笨或者说太懒,没有备份我的文件数据.结果呢?数据丢失了!在一瞬间就丢 ...

  3. 如何在Git分支中搜索文件或目录?

    本文翻译自:How can I search Git branches for a file or directory? In Git, how could I search for a file o ...

  4. object-c中管理文件和目录:NSFileManager使用方法

    object-c中管理文件和目录:NSFileManager使用方法 对于NSFileManager,文件或目录是使用文件的路径名唯一标识的.每一个路径名都是一个NSString对象,它可以是相对路径 ...

  5. python操作目录_详解python中的文件与目录操作

    详解python中的文件与目录操作 一 获得当前路径 1.代码1 >>>import os >>>print('Current directory is ',os. ...

  6. junit rule_使用@Rule在JUnit中测试文件和目录

    junit rule 多亏了TemporaryFolder @Rule在JUnit中使用文件和目录进行测试很容易. 在JUnit中,规则( @Rule )可以用作夹具设置和清除方法( org.juni ...

  7. 使用@Rule在JUnit中测试文件和目录

    多亏了TemporaryFolder @Rule在JUnit中使用文件和目录进行测试很容易. 在JUnit中,规则( @Rule )可以替代或设置夹具设置和清除方法( org.junit.Before ...

  8. PHP笔记-通过输入获取文件夹中的文件和目录例子

    程序运行截图如下: 点击提交后打印此内容: 文件结构如下: 源码如下: dirFile.php <?phpfunction dirFile($dir, &$error){if(!is_d ...

  9. python判断linux中文件是否存在_linux shell 中判断文件、目录是否存在的方法

    本文主要介绍了linux shell 中判断文件.目录是否存在的方法,分享给大家 -e filename 如果 filename存在,则为真 -d filename 如果 filename为目录,则为 ...

最新文章

  1. python七大神级插件_IntelliJ IDEA 15款超级牛逼插件推荐(自用,超级牛逼)
  2. 通过响应式web设计,使本站支持手机浏览
  3. 用WSDL定义Web服务
  4. C++与QML逻辑分离
  5. 职业:图像处理入门教程
  6. Mysql的关联查询语句
  7. windows环境实现批量加密文件,并创建加密文件同名(不带后缀)的文件夹,然后把加密文件和图片和文本放入这个文件夹。
  8. 曲线连接线_荷重位移曲线仪操作使用注意事项-荷重位移曲线仪厂家
  9. 什么是Intel LBR(上次分支记录),BTS(分支跟踪存储)和AET(体系结构事件跟踪)?
  10. 研发的未来在哪里?Serverless 云开发来了!
  11. java简单单向链表_用java简单的实现单链表的基本操作
  12. C#两个窗体间的相互通信(转)
  13. 互联网定律及效应汇编
  14. AT绑定句柄无效和拒绝访问
  15. pip install 报错:ERROR: Exception: Traceback (most recent call last):..raise ValueError(“check_hostnam
  16. Jenkins——Jenkins介绍+基于云平台的Jenkins安装和持续集成环境配置(插件+用户权限+凭据+Maven打包)
  17. 用VSCode编写Latex时遇到的问题(Mac系统下)
  18. OSPF与BGP协议流程与协议格式简单学习
  19. 精通人脸识别10:RGB颜色空间
  20. unity3d实现简单的打飞碟游戏

热门文章

  1. 构造函数调用虚函数先从子类搜索同名函数
  2. SGU 113 Nearly prime numbers
  3. 合理规划您的硬盘分区
  4. [Windows编程] 获取系统CPU 个数
  5. asp.net基础复习(二)——母版页
  6. vss2005与vs2005绑定问题解决
  7. “偷懒”的表单验证Demo
  8. input:file上传类型控制简单介绍
  9. python函数参数理解
  10. 如何在Atomic主机上远程使用 Docker