linux檔案 link函式 檔案硬鏈結和軟連線

2021-08-25 17:41:09 字數 4356 閱讀 1727

標頭檔案:#include 定義函式:int link (const char * oldpath, const char * newpath);

標頭檔案:#include 定義函式:int unlink(const char * pathname);
unlink()會刪除引數pathname 指定的檔案. 如果該檔名為最後連線點, 但有其他程序開啟了此檔案, 則在所有關於此檔案的檔案描述詞皆關閉後才會刪除. 如果引數pathname 為一符號連線, 則此連線會被刪除。

硬鏈結建立條件,建立的除非是root使用者,否則建立硬鏈結只能是針對檔案名字;

建立硬鏈結必須在同乙個分割槽;

只有超級使用者才能夠對目錄建立硬鏈結;

硬鏈結檔案刪除的過程是刪除檔案計數,檔案硬鏈結計數為0的時候會刪除檔案,但是前提條件是沒有其他程序開啟該檔案。

andrew@andrew-thurley:~/work/filedir$ ls -l name

-rw-rw-r-- 2 andrew andrew 43 8月 22 21:33 name

andrew@andrew-thurley:~/work/filedir$ ls date.txt

date.txt

andrew@andrew-thurley:~/work/filedir$ ls -l date.txt

-rw-rw-r-- 2 andrew andrew 43 8月 22 21:33 date.txt

andrew@andrew-thurley:~/work/filedir$ ls -l a.out

-rwxrwxr-x 1 andrew andrew 8840 8月 24 23:10 a.out

andrew@andrew-thurley:~/work/filedir$

建立硬鏈結之後顯示硬鏈結檔案是乙個普通的檔案,其中在許可權說明之後顯示的  的數字2說明的是檔案的鏈結數。

-rwxrwxr-x 第乙個 『-』指的是普通檔案,然後徐後面的是,r可讀,w可寫,x可執行,分別u+g+o

若是刪除原始檔,硬鏈結還是能夠看到檔案的內容

硬鏈結建立共享同乙個 i節點但是軟連線建立的時候會生成自己的 i 節點。

建立硬鏈結只是建立了檔案的連線數,有硬鏈結的檔案當刪除原始檔的時候刪除的只是檔案的連線計數,並沒有刪除磁碟上的檔案,建立硬鏈結也會造成連線數加1。刪除檔案的實質就是將檔案的硬鏈結數減少到0,所以硬鏈結雖然沒有在磁碟上建立檔案,但是硬鏈結出來的檔名是跟源檔名同等的。 

#includeint symlink(const char*actualpath,const char *sympath);

#include /* definition of at_* constants */

#include int symlinkat(const char *actualpath,int fd,const char *sympath);

兩個函式返回值:若成功,返回0;若出錯,返回-1

兩個函式返回值:若成功,返回0;若出錯,返回-1

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

symlink函式建立了乙個指向actualpath的新目錄項sympath。在建立此符號鏈結時,並不要求actualpath已經存在。並且actualpath和sympath並不需要位於同一檔案系統中。

symlinkat函式與symlink函式類似,但sympath引數根據相對於開啟檔案描述符引用的目錄(由fd指定)進行計算。如果sympath引數指定的是絕對路徑或者fd引數設定了at_fdcwd值,那麼symlinkat就等同於symlink函式。

readlink和readlinkat函式組合了open、read和close的所有操作。如果函式成功執行,則返回讀入buf的位元組數。在buf中返回的符號鏈結的內容不以null字元終止。

當pathname引數指定的是絕對路徑名或者fd引數的值為at_fdcwd,readlinkat函式的行為與readlink相同。但是,如果fd引數是乙個開啟目錄的有效檔案描述符並且pathname引數是相對路徑名,則readlinkat計算相對於由fd代表的開啟目錄的路徑。

建立軟連線:

#include #include #include #include #include #include #include #define buffsize 1024

int main(int argc,char *argv)

char buf[buffsize];

ssize_t sz;

dir *dp;

int fd;

//獲取相對路徑名返回的檔案描述符fd

if((dp = opendir(argv[2])) == null)

if((fd = dirfd(dp)) < 0)

//建立符號鏈結

if(symlinkat(argv[1],fd,argv[3]) < 0)

//讀取符號鏈結

bzero(buf,sizeof(buf));

if((sz = readlinkat(fd,argv[3],buf,sizeof(buf))) < 0)

printf("buf:%s,length:%u\n",buf,(unsigned int)sz);

close(fd);

return 0;

}

建立軟連線:使用  ln -s oldfilename  newfilename

andrew@andrew-thurley:~/work/filedir$ ln -s date1.txt s1_l

andrew@andrew-thurley:~/work/filedir$ ls -l date1.txt s1_l

-rw-rw-r-- 1 andrew andrew 43 8月 25 00:03 date1.txt

lrwxrwxrwx 1 andrew andrew 9 8月 25 00:04 s1_l -> date1.txt

andrew@andrew-thurley:~/work/filedir$

刪除原始檔軟連線,就不能檢視檔案的內容,會提示是沒有那個檔案或目錄;

建立軟連線之後檔案顯示的檔案連線數還是1

軟連線就像windows上建立乙個快捷方式一樣;並且軟連線會顯示檔案的型別是  l 也就是說明 檔案是連線型的檔案

軟連線我檔案建立可以跨分割槽建立符號連線,建立符號鏈結並不要求actualpath即原檔案一定存在。

如圖,左邊是硬鏈結,右邊是軟連線;

硬鏈結只建立了目錄項然後使i節點的硬鏈結計數加1,刪除的時候也只是對i節點的連線計數減1, 軟連線建立了目錄項,i節點,資料塊,但是資料塊中存放的不是

原始檔內容的複製,存放的是原始檔路徑,因此當原始檔刪除的時候,再去使用軟連線軟連線檔案將提示檔案不存在或已刪除。

#include #include int remove(const char *pathname);
對於檔案remove的左右和unlink的作用是一樣的,但是對於目錄來說使用remove相當於使用rmdir 即刪除目錄。

#include int rename(char * oldname, char * newname);

函式rename()用於重新命名檔案、改變檔案路徑或更改目錄名稱。

oldname為舊檔名,newname為新檔名。

修改檔名成功則返回0,否則返回-1。

重新命名檔案:

如果newname指定的檔案存在,則會被刪除。

如果newname與oldname不在乙個目錄下,則相當於移動檔案。

重新命名目錄:

如果oldname和oldname都為目錄,則重新命名目錄。

如果newname指定的目錄存在且為空目錄,則先將newname刪除。

對於newname和oldname兩個目錄,呼叫程序必須有寫許可權。

重新命名目錄時,newname不能包含oldname作為其路徑字首。例如,不能將/usr更名為/usr/foo/testdir,因為老名字( /usr/foo)是新名字的路徑字首,因而不能將其刪除。

Linux 鏈結檔案link

linux系統鏈結檔案分兩種,一者硬鏈結檔案,二者軟鏈結檔案 兩檔案都可通過命令ln來生成。1.硬鏈結檔案 硬鏈結 hard link,也稱鏈結 就是檔案的乙個或多個檔名。再說白點,所謂鏈結無非是把檔名和計算機檔案系統使用的節點號鏈結起來。因此可以用多個檔名與同乙個檔案進行鏈結,這些檔名可以在同一目...

軟拷貝指令碼 link檔案

bin bash 使用bash做為預設shell src 1 dst 2 srclen list alldir if d file then mkdir p newfile if l file then rm file ln s newfile file filist alldir file els...

檔案引入方式 link 和 import

link 和 import 作用 樣式的匯入方式 link 的使用 import 的使用 link 和 import 的區別 引入的內容不同 link 除了引用樣式檔案,還可以引用等資源檔案,而 import 只引用樣式檔案 載入順序不同 link 引用 css 時,在頁面載入時同時載入 impor...