由link()和symlink()談到軟鏈接與硬鏈接


任何一個文件可以有多個目錄項指向其i節點。創建一個向現存文件連接的方法是使用l i n k函數。
#include <unistd.h>
int link(const char * e x i s t i n g p a t h, const char * n e w p a t h) ;
返回:若成功則為0,若出錯則為-1
此函數創建一個新目錄項n e w p a t h,它引用現存文件e x i s t i n g p a t h。如若n e w p a t h已經存在,則返回出錯。
這是Apue上關於link函數的介紹,看到這里我並沒有在意上面的第一句話,直到下面這個函數出現:
s y m l i n k函數創建一個符號連接。
#include <unistd.h>
int symlink(const char * a c t u a l p a t h, const char * s y m p a t h) ;
返回:若成功則為0,若出錯則為-1
該函數創建了一個指向a c t u a l p a t h的新目錄項s y m p a t h,在創建此符號連接時,並不要求a c t u a l p a t h已經存在,並且,a c t u a l p a t h和s y m p a t h並不需要位於同一文件系統中。
這兩個函數有什么不同?大神們沒事兒閑的,不會是寫重了吧?其實不同點很容易看出來,但要真正理解緣由,要涉及到linux下的硬鏈接和軟鏈接(也就是所謂的符號鏈接)概念!
符號鏈接是對一個文件的間接指針,相當於windows下的快捷方式。它與硬鏈接有所不同,硬連接直接指向文件的i節點。這是個很有趣的區別,用ln命令為文件建立的硬鏈接等同於原文件,而ln -s建立的符號鏈接,確是另外的一種文件類型——符號鏈接(symbolic link)。啰嗦了半天,有什么了不起,不就是不同文件類型嘛!那嘗嘗這個小問題:用open函數打開符合鏈接文件,結果會如何?符號鏈接本身的內容又是什么?該怎樣讀取它?
大神們這回又閑了,居然整出如下函數:
#include <unistd.h>
int readlink(const char * p a t h n a m e, char *b u f, int b u f s i z e) ;
返回:若成功則為讀的字節數,若出錯則為-1
此函數組合了open, read和c l o s e的所有操作。
看了如下這張表你就明白了:
各個函數對符號連接的處理

Function

Does not follow symbolic link

Follows symbolic link

access

 

chdir

 

chmod

 

chown

creat

 

exec

 

lchown

 

link

 

lstat

 

open

 

opendir

 

pathconf

 

readlink

 

remove

 

rename

 

stat

 

truncate

 

unlink

 
對於不同的文件類型,采用不同的功能函數,這包括對目錄文件的處理!在linux的世界里,函數的誤用,是個常見的錯誤。從原理上理解這些函數和基礎概念,才能緊綳這根弦兒!

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM