UNIX目录中有2中类型的链接——硬链接和符号链接。
 
硬链接本身就是一个目录项,(比如文件名+索引节点号),可以将文件名与文件的位置关联起来;
符号链接也称软链接,是指存储了一个字符串的文件。这个字符串可以在路径名解析的过程中,用于修改路径名。
 
----------------------------------------------------
  假设文件是用索引节点来表示的
----------------------------------------------------
 
目录项对应于单个链接,但是一个索引节点可能有几个链接的目标(对应几个目录项),因此索引节点中包含一个对链接到索引节点的链接数的计数。当用open()创建一个新的文件时,操作系统就会创建一个新的目录项,并分配一个空闲的索引节点来表示该文件。
 UNIX文件:硬链接和符号链接_unix
                                                       图 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:
 UNIX文件:硬链接和符号链接_unix_02
                                                 图 2
(2) 创建一个符号链接
符号链接是一个包含了另一个文件或目录名字的文件。引用符号链接的名字会使操作系统去定位对应于那个链接的索引节点,知道最终遇到一个硬间接和一个真正的文件为止。如果过了一段时间,系统没有找到文件,则放弃并返回ELOOP错误。
 
使用ln命令带选项-s 或者函数symlink(),都可以创建符号链接。
 
#include <unistd.h>
int symlink ( const char *path1, const char *path2);
 
这里path2是新创建的链接,新链接指向path1 。如图3:
 UNIX文件:硬链接和符号链接_unix_03
                                                                       图 3
 
这里,符号链接使用了一个新的索引节点(13579),该索引节点包含了说明它是一个符号链接的信息。符号链接至少需要一个数据块(如15213),数据块中包含了/dirB/name2要链接的文件名称,这里即为/dirA/name1。