符號鏈結的用途
符號鏈結是對乙個檔案的間接指標,它與前面介紹的硬連線不同,硬連線指向檔案的i節點。引入符號鏈結是為了避開硬連線的一些限制:
跟隨符號鏈結
符號鏈結一般用於將乙個檔案或整個目錄結構移到系統中另外乙個位置。
用符號鏈結作為函式引數時,需要了解該函式所處理的是否是符號鏈結指向的檔案。也就是是否跟隨符號鏈結。
圖4-17列出了本章中所說明的各個函式是否處理符號鏈結。
特殊的例子:
如果同時使用o_creat和o_excl,呼叫open函式。
符號鏈結可能引入迴圈
harlan@desktop-ku8c3k5:/github/apue/chapter_4/myexamples$ mkdir foo
harlan@desktop-ku8c3k5:/github/apue/chapter_4/myexamples$ touch foo/a
harlan@desktop-ku8c3k5:/github/apue/chapter_4/myexamples$ ln -s ../foo foo/testdir
harlan@desktop-ku8c3k5:/github/apue/chapter_4/myexamples$ ls -l foo
total 0
-rw-rw-r-- 1 harlan harlan 0 jun 11 16:40 a
lrwxrwxrwx 1 harlan harlan 6 jun 11 16:40 testdir -> ../foo
圖4-18顯示了結果:
可以一直迴圈下去。。。
harlan@desktop-ku8c3k5:/github/apue/chapter_4/myexamples$ cd foo/testdir/testdir/testdir/testdir
harlan@desktop-ku8c3k5:/github/apue/chapter_4/myexamples/foo/testdir/testdir/testdir/testdir$
solaris的標準函式ftw以降序遍歷檔案結構,列印遇到的每個路徑名,直至ftw出錯返回。但是linux中的ftw和nftw記錄了看到的目錄並避免多次重複乙個目錄,因此這兩個函式不顯示solaris中ftw的出錯執行行為。
open乙個符號鏈結
harlan@desktop-ku8c3k5:/github/apue/chapter_4/myexamples$ ln -s /no/sucn/file myfile
harlan@desktop-ku8c3k5:/github/apue/chapter_4/myexamples$ ll myfile
lrwxrwxrwx 1 harlan harlan 13 6月 12 08:28 myfile -> /no/sucn/file
harlan@desktop-ku8c3k5:/github/apue/chapter_4/myexamples$ cat myfile
cat: myfile: 沒有那個檔案或目錄
使用symlink或者symlinkat函式建立乙個符號鏈結。
#include int symlink(const char* actualpath,const char *sympath);
int symlinkat(const char*actualpath,int fd,const char* sympath);
成功返回0;如果出錯返回-1
#include ssize_t readlink(const char* restrict pathname,char *restrict buf,size_t bufsize);
ssize_t readlinkat(int fd,const char* restrict pathname,char * restrict buf,size_t bufsize);
成功返回讀取的位元組數;如果失敗返回-1。
個人部落格: APUE筆記 檔案和目錄
4.10 粘著位 在早期的作業系統中,未使用分頁技術。程式在磁碟上是隨機儲存的,則在裝入程式是會耗費較大的時間,為保證下次執行程式時能將程式正文快裝入記憶體,作業系統在磁碟上開闢了塊交換區。交換區的檔案是連續儲存的,裝入速度相對會更快。現在作業系統使用分頁技術,因此不再使用這種技術。但一般都擴充套件...
APUE 檔案和目錄 中
乙個檔案可以有多個目錄項指向其i節點。使用link函式可以建立乙個指向現存盤案連線 include int link const char existingpath,const char newpath 返回值 成功為0,出錯為 1 該函式建立乙個新目錄項newpath,指向現存盤案existing...
APUE 檔案和目錄 二
link,unlink,remove和rename函式 include int link const char existingpath,const char newpath 返回 若成功則為0,若出錯則為 1 為了刪除乙個現存的目錄項,可以呼叫unlink函式。include int unlink...