Shell命令-ln链接

Posted by 周思进 on December 29, 2019

ln命令日常工作偶尔也会使用到,只是经常会搞不清已存在文件和要生成文件参数的前后顺序… 根据阅读《Linux系统编程手册》第18章做了一点笔记。

一、硬链接

命令:
ln TARGET LINK_NAME
也不知道是不是man手册使用TARGET名称的缘故,总觉得目标应该是表示的最终会生成的文件… 当然这里LINK_NAME也是很清晰表明后面的是要生成的链接名称

该命令操作会生成一个硬链接,其和原有文件都指向相同的i-node节点。

// mac环境
硬链接

从上图可以看出,硬链接的inode节点(通过ls命令的-i选项,第一列)都是相同的,因此都指向相同文件,其中第三列是i-node链接计数,表示指向该文件存在的文件名个数。

当删除其中一个文件名,计数减一,当链接计数为0时,才真正释放该文件名所指代的i-node信息和数据块。

因为指向的是同一个文件,所以打开其中一个文件名操作内容保持后,打开其他文件名显示的内容都是一致的。

硬链接的限制
1、因为目录条目对文件的指代采用i-node编号,而i-node编号的唯一性仅在一个文件系统之内才能得到保障,所以硬链接必须与其指代的文件驻留在同一文件系统中。

2、不能为目录创建硬连接,从而避免出现令多系统程序限于混乱的连接环路


二、软链接

命令:
In-s TARGET LINK_NAME

软链接

软链接与硬链连接不同,其软链接有自己的i-node节点

如果软链接指向的文件不存在了,其软链接本身还将继续存在,此类链接成为悬空链接,此时打开该软链接会提示文件已不存在。如果后面把删除的文件又重新生成了,则软链接又可以重新打开访问了。

软链接指向的文件既可以是绝对路径,也可以是相对路径。还可以为当前并不存在的文件名创建一个符号链接,只要后面再创建对应的文件即可。

因为软链接指代一个文件名,而非inode编号,所以对硬链接的限制不存在。

软链接的使用场景在动态库上会比较常见。
这里提一个使用场景,开发了一个程序test,通过不同的入参来表示执行什么功能,比如‘test -a’表示吃饭,‘test -b’ 表示睡觉,可以通过ln进行软链接test生成不同的文件名eat和sleep,通过执行eat和sleep来完成工作,这样执行上更易于记忆理解,代码上则是针对argv[0]入参做下判断区分即可。