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]入参做下判断区分即可。