《UNIX环境高级编程》--符号链接


符号链接是指向一个文件的间接指针。他与上一节所诉的硬链接不同。硬链接直接指向文件的i节点。引入符号链接的原因是为了避开硬链接的一些限制。

UNIX高级环境编程(第二版)源代码 http://www.bkjia.net/thread-2069-1-1.html
 
UNIX环境高级编程中文第二版PDF高清版 http://www.bkjia.net/thread-2063-1-1.html

•硬链接通常要求链接和文件位于同一文件系统中。

•只有超级用户才能创建指向目录的硬链接。

对符号链接以及他指向何种对象并无任何文件系统限制。任何用户都可以创建指向目录的符号链接。符号链接一般用于将一个文件或这个目录结构移动到系统中的另一个位置。

当使用以名字引用文件的函数的时候,应当了解该函数是否处理符号链接。也就是该函数是否跟随符号链接到达它锁链节的文件。如若该函数具有处理符号链接的功能,则其路径名参数引用由符号链接指向的文件。否则路径名参数将引用链接本身。而不是该链接指向的文件。下表列出了本章中所说明的各个函数是否处理符号链接。

上表没有列出mkdir,mkinfo,mknod和rmdir这些函数。其原因是当路径名是符号链接的时候,他们都出现错误返回。以文件描述符作为参数的一些函数也未在该表中列出。原因是,对富豪链接的处理是由返回文件描述符的函数同事是open进行的。chown是否跟随符号链接取决于实现。

函数

不跟随符号链接 跟随符号链接
access   *
chdir   *
chmod   *
chown * *
creat   *
exec   *
lchown *  
link   *
lstat *  
open   *
opendir   *
pathconf   *
readlink *  
remove *  
rename *  
stat   *
truncate   *
unlink *  

上表中一个例外是,同时用O_CREAT和O_EXCL两者调用open函数。在此情况下,若路径名引用符号链接,open函数将出错返回。并将errno设置成EEXIST..这种处理方式的意图是阻塞一个安全性漏洞。使其具有特权的进程不会被诱骗对不适合的文件进行写操作。
 
实例:
 
使用符号链接可能在文件系统中引入循环。大多数查找路径名的函数在这种情况下发生时都将返回值为ELOOP和errno。

[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,它包含了一个一个名为a的恩见以及一个指向foo的符号链接。

在下图显示了这个结果,图中 以圆表示目录,以正方形表示文件

从图中,我们可以看到foo到testdir是一个循环。这样的一个循环很容易消除。因为unlink并不跟随符号链接,所以可以unlink文件foo/testdir,但是如果创建一个构成这种循环的硬链接,那么就很难消除它。这就是为什么link函数burn徐构造指向目录的硬链接的原因。

用open函数打开文件的时候如果传递给open函数的路径名制定了一个符号链接,那么open跟随此链接达到你所指定的文件。若此符号链接所指向的文件并不存在。则open返回出错。表示不能打开该文件。这可能会使不熟悉符号练级的用户感到迷惑。如下例子

linux系统会提示这两个文件,myfile文件存在但cat后却称没有这一个文件。其原因是某与file

是一个符号链接。但该链接所指向的文件不存在。ls命令-l选型给我们提示。->前为符号链接。之后为文件。也可以是使用-F选项。

相关内容