IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

unix文件系统:链接与文件

博客园-rethink log 2009-10-16 12:10:58 累计浏览 3,643 次
本机暂存

    说明:以下是在读小骆驼书《Perl 语言入门》第十二章 目录操作 中“链接与文件”一节(P189-193)中的读书笔记。

    目录是一种由系统管理的特殊文件,它基本上是一份列表。

    每份文件都会存储在一个编好号的inode里,我们可以把它想象成磁盘上的门牌号码。

    ls -l命令,硬链接的数量会显示在权限标记的右边。

    每个目录都会有 . 这个项目,它会指回目录本身的inode。所以任何目录的链接数都至少是2.一般来说,目录的链接数等于子目录的数量加上2.

    链接分硬链接和软链接(又叫符号链接)。

    【硬链接】

    硬链接的本质是:不同的文件名指向同样的inode,文件事实上只有一份。

    建立硬链接:

    shell命令:ln file1 file2

    perl命令:link file1 file2

    此时,file1和file2指向同一个inode(假定inode为12345),文件事实上只有1份,修改file1的时候同时会修改file2(因为只有一个文件)。但是要注意用文本编辑器进行修改的时候,可能会导致变成两份文件,视文本编辑器的原理而定。

    当删除file1的时候,inode 12345的链接数减一,file2并不会删除。只删除file2的时候,也是一样原理。

    当该inode的链接数等于0的时候,数据就丢失了。

    因为硬链接的性质,所以在某种程度上可以防止数据的流失(只要inode的链接数大于0,数据就还在)。

    perl的rename函数可以将文件搬移到别的目录里,但是来源和目的地必须在同一个文件系统上(同一个磁盘上),因为rename的原理是基于文件的 inode 列表。如果跨磁盘搬移文件,那inode里的数据就必须重新部署。

    目录不能建立硬链接(从文件系统基于inode的原理很容易理解为什么。如果可以的话,文件系统那就乱套了,而且整个系统的性能不知道要低成什么样了)

    【软链接】

    软链接又叫符号链接。它是目录里的一种特殊项目,用来告诉系统到别的方向找找看。

    建立软链接:

    shell命令:ln -s fileA fileB

    perl命令:symlink "fileA" "fileB"

    假定fileA的inode为34567,inode的链接数为1.那么在建立软链接之后,inode的链接数仍然为1,保持不变。

    符号链接只是告诉系统:如果你是来找fileB的,请到fileA那边去。仅此而已。

    如果删除fileA,那么该inode的链接数就减到0,则文件内容永久丢失了。

    目录可以建立软链接。

    perl里面使用readlink可以取得软链接所指向的位置。

    硬链接和软链接都非常有用。但unix之外的很多系统对此两者都不支持。

    这两种链接都可以用unlink移除,unlink只是从目录里移除该文件名的链接项目,将它的链接数递减,如有需要再释放inode。这也是为什么perl和php中的文件删除函数取名为 unlink 的原因。

同分类推荐文章

  1. 等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
  2. Go 实验特性详解 (2026-06-21 10:05:27)
  3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

查看更多 后端 文章 →

建议继续学习

  1. 调试工具之GDB (累计阅读 14,830)
  2. colortail,让 tail 命令绚丽起来 (累计阅读 10,260)
  3. 其实,文件也可以truncate (累计阅读 8,574)
  4. 三种东西永远不要放到数据库里 (累计阅读 8,052)
  5. Linux知识:为什么要用字符~来表示home目录 (累计阅读 6,901)
  6. C 语言的前世今生 (累计阅读 6,195)
  7. 使用Shell快捷键助你一臂之力 (累计阅读 5,477)
  8. 《Linux/Unix 设计思想》的翻译细节讨论 (累计阅读 5,012)
  9. 用Unix的设计思想来应对多变的需求 (累计阅读 4,913)
  10. Nginx的master和worker进程间的通信 (累计阅读 4,822)