Linux下的链接分为两种:硬链接(Hard Link),符号链接(Symbolic Link,也称软链接)。默认情况下,ln命令产生硬链接,加上-s参数时产生软链接。本文讲述链接的基本概念,以及程序中处理链接的相关函数。

一,概念理解

1,硬链接

硬链接指通过索引节点来进行链接。在Linux文件系统中,保存在磁盘分区上面的软件,不管是什么类型,都会分配一个编号,称为索引节点号(Inode Index)。在Linux中,多个文件名指向同一个索引节点,一般这种链接就是硬链接。硬链接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬链接到重要文件,以防止“误删”的情况。因为对该目录的索引节点上有一个以上的链接,只删除一个连接并不影响索引节点本身和其他的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬链接文件全部被删除。

2, 软链接

软链接有点类似于Windows的快捷方式。他实际上是一个特殊的文件,是指向一个文件的间接指针。在符号链接中,文件实际是一个文本文件,其中包含有另一个文件的位置信息。引入符号链接的原因是为了避开硬链接的一些限制:

  • 硬链接通常要求链接和文件位于同一文件系统中。
  • 只有超级用户才可以创建指向目录的硬链接。

二,实验

1,实验一

allan@ubuntu:temp$ touch f1      # 创建一个测试文件f1
allan@ubuntu:temp$ ln f1 f2        # 创建f1的一个硬链接文件f2
allan@ubuntu:temp$ ln -s f1 f3    # 创建f1的一个符号链接文件f3
allan@ubuntu:temp$ ls -li        # -i参数显示文件的inode节点信息
total 0
1719347 -rw-rw-r-- 2 allan allan 0 Nov 12 03:28 f1
1719347 -rw-rw-r-- 2 allan allan 0 Nov 12 03:28 f2
1719442 lrwxrwxrwx 1 allan allan 2 Nov 12 03:29 f3 -> f1

2,实验二

allan@ubuntu:temp$ echo "I am f1" >> f1
allan@ubuntu:temp$ cat f1
I am f1
allan@ubuntu:temp$ cat f2
I am f1
allan@ubuntu:temp$ cat f3
I am f1
allan@ubuntu:temp$ rm -f f1
allan@ubuntu:temp$ cat f2
I am f1
allan@ubuntu:temp$ cat f3
cat: f3: No such file or directory

结论:可以看出,当删除原始文件f1后,硬链接不受影响,但是符号链接f1文件无效了。

三,程序中使用链接

上面讲述了使用ln命令去创建链接。如果是在程序里面,则可以使用link函数创建硬链接

#include <unistd.h>
int link(const char *oldpath, const char *newpath);

返回值:成功返回0,失败返回-1.
  • 如果newpath已经存在,则返回出错。
  • 只创建newpath中的最后一个分量,路径中的其他部分应当以及存在。比如newpath为/path1/path2/path3,那么path1和path2应该事先就存在。
  • 虽然POSIX.1允许实现支持跨文件系统的链接,但是大多数实现要求这两个路径名在同一个文件系统中。
  • 因为原文件和新的链接指向同一个文件,所以他们也拥有同样的访问权限和所有者,而且无法区分哪个是原文件,哪个是硬链接。
  • 只有超级用户才可以创建一个指向目录的硬链接。因为创建目录的硬链接可能会在文件系统中形成循环,大多数处理文件系统的实用程序都无法处理这种情况。
  • 如果返回出错,可以查看errno的值,具体可以man 2 link去查看每种errno值代表的含义。