符號鏈接是指向一個文件的間接指針。他與上一節所訴的硬鏈接不同。硬鏈接直接指向文件的i節點。引入 符號鏈接的原因是為了避開硬鏈接的一些限制。
硬鏈接通常要求鏈接和文件位於同一文件系統中。
只有超級用戶才能創建指向目錄的硬鏈接。
對符號鏈接以及他指向何種對象並無任何文件系統限制。任何用戶都可以創建指向目錄的符號鏈接。符號 鏈接一般用於將一個文件或這個目錄結構移動到系統中的另一個位置。
當使用以名字引用文件的函數 的時候,應當了解該函數是否處理符號鏈接。也就是該函數是否跟隨符號鏈接到達它鎖鏈節的文件。如若該函 數具有處理符號鏈接的功能,則其路徑名參數引用由符號鏈接指向的文件。否則路徑名參數將引用鏈接本身。 而不是該鏈接指向的文件。下表列出了本章中所說明的各個函數是否處理符號鏈接。
函數 不跟隨符號鏈接 跟隨符號鏈接 access chdir chmod chown creat exec lchown link lstat opendir pathconf readlink remove rename stat truncate unlink上表沒有列出mkdir,mkinfo,mknod和rmdir這些函數。其原因是當路徑名是符號鏈接的時候,他 們都出現錯誤返回。以文件描述符作為參數的一些函數也未在該表中列出。原因是,對富豪鏈接的處理是由返 回文件描述符的函數同事是open進行的。chown是否跟隨符號鏈接取決於實現。
上表中一個例外是,同 時用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 選項。