本篇博文内容摘自《UNIX环境高级编程》(第二版),仅作个人学习记录所用。关于本书可参考:http://www.apuebook.com/。
符号链接是指向一个文件的间接指针,它与硬链接有所不同,硬链接直接指向文件的i节点。引入符号链接的原因是为了避开硬链接的一些限制:
硬链接通常要求链接和文件位于同一文件系统中。
只有超级用户才能创建指向目录的硬链接。
对符号链接以及它指向何种对象并无任何文件系统限制,任何用户都可创建指向目录的符号链接。符号链接一般用于将一个文件或整个目录结构移到系统中的另一个位置。
当使用以名字引用文件(而不是用打开文件的描述符引用文件)的函数时,应当了解该函数是否处理符号链接。也就是该函数是否跟随符号链接到达它所链接的文件。如果该函数具有处理符号链接的功能,则其路径名参数引用由符号链接指向的文件。否则,路径名参数将引用链接本身,而不是该链接指向的文件。表4-9列出了文件和目录章节中说明的各个函数是否处理符号链接。在表4-9中没有列出mkdir、mkinfo、mknod和rmdir这些函数,其原因是,当路径名是符号链接时,它们都出错返回。以文件描述符作为参数的一些函数(如fstat、fchmod等)也未在该表中列出,其原因是,对符号链接的处理是由返回文件描述符的函数(通常是open)进行的。chown是否跟随符号链接取决于实现。
在Linux 2.1.81之前的各版本中,chown并不跟随符号链接。从2.1.81版开始,chown跟随符号链接。
表4-9的一个例外是,同时用O_CREAT和O_EXCL两者调用open函数。在此情况下,若路径名引用符号链接,open将出错返回,并将error设置为EEXIST。这种处理方式的意图是堵塞一个安全性漏洞,使具有特权的进程不会被诱骗对不适当的文件进行写操作。
表4-9 各个函数对符号链接的处理