符号链接是指向一个文件的间接指针。他与上一节所诉的硬链接不同。硬链接直接指向文件的i节点。引入符号链接的原因是为了避开硬链接的一些限制。
对符号链接以及他指向何种对象并无任何文件系统限制。任何用户都可以创建指向目录的符号链接。符号链接一般用于将一个文件或这个目录结构移动到系统中的另一个位置。
当使用以名字引用文件的函数的时候,应当了解该函数是否处理符号链接。也就是该函数是否跟随符号链接到达它锁链节的文件。如若该函数具有处理符号链接的功能,则其路径名参数引用由符号链接指向的文件。否则路径名参数将引用链接本身。而不是该链接指向的文件。下表列出了本章中所说明的各个函数是否处理符号链接。
函数 |
不跟随符号链接 | 跟随符号链接 |
access | * | |
chdir | * | |
chmod | * | |
chown | * | * |
creat | * | |
exec | * | |
lchown | * | |
link | * | |
lstat | * | |
open | * | |
opendir | * | |
pathconf | * | |
readlink | * | |
remove | * | |
rename | * | |
stat | * | |
truncate | * | |
unlink | * |
[devis@gdmss unix_pro]$ mkdir foo [devis@gdmss unix_pro]$ touch foo/a [devis@gdmss unix_pro]$ ln -s ../foo foo/testdir [devis@gdmss unix_pro]$ ls -l foo
总计 0 -rw-rw-r-- 1 devis devis 0 10-24 22:03 a lrwxrwxrwx 1 devis devis 6 10-24 22:03 testdir -> ../foo
从图中,我们可以看到foo到testdir是一个循环。这样的一个循环很容易消除。因为unlink并不跟随符号链接,所以可以unlink文件foo/testdir,但是如果创建一个构成这种循环的硬链接,那么就很难消除它。这就是为什么link函数burn徐构造指向目录的硬链接的原因。
用open函数打开文件的时候如果传递给open函数的路径名制定了一个符号链接,那么open跟随此链接达到你所指定的文件。若此符号链接所指向的文件并不存在。则open返回出错。表示不能打开该文件。这可能会使不熟悉符号练级的用户感到迷惑。如下例子
linux系统会提示这两个文件,myfile文件存在但cat后却称没有这一个文件。其原因是某与file
是一个符号链接。但该链接所指向的文件不存在。ls命令-l选型给我们提示。->前为符号链接。之后为文件。也可以是使用-F选项。