linux文件-link函数(文件硬链接和软连接)
創建硬鏈接的函數:
相關函數:symlink, unlink頭文件:#include <unistd.h>定義函數:int link (const char * oldpath, const char * newpath);函數說明:link函數中oldpath指定已經存在文件,newpath指定的名稱建立一個新的連接(硬鏈接),若是newpath指定的文件已存在則不會建立連接;
頭文件:#include <unistd.h>定義函數:int unlink(const char * pathname);unlink()會刪除參數pathname 指定的文件. 如果該文件名為最后連接點, 但有其他進程打開了此文件, 則在所有關于此文件的文件描述詞皆關閉后才會刪除. 如果參數pathname 為一符號連接, 則此連接會被刪除。
硬鏈接創建條件,創建的除非是root用戶,否則創建硬鏈接只能是針對文件名字;
創建硬鏈接必須在同一個分區;
只有超級用戶才能夠對目錄創建硬鏈接;
硬鏈接文件刪除的過程是刪除文件計數,文件硬鏈接計數為0的時候會刪除文件,但是前提條件是沒有其他進程打開該文件。
?
創建硬鏈接使用的命令: ln? oldfilename newfilename
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,所以硬鏈接雖然沒有在磁盤上創建文件,但是硬鏈接出來的文件名是跟源文件名同等的。
?
#include<unistd.h>int symlink(const char*actualpath,const char *sympath);#include <fcntl.h> /* Definition of AT_* constants */#include <unistd.h>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);兩個函數返回值:若成功,返回讀取的字節數;若出錯,返回-1symlink函數創建了一個指向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 <stdio.h> #include <unistd.h> #include <stdlib.h> #include <string.h> #include <errno.h> #include <sys/types.h> #include <dirent.h> #define BUFFSIZE 1024int main(int argc,char *argv[]) {if(argc != 4){printf("param too few\n");exit(EXIT_FAILURE);}char buf[BUFFSIZE];ssize_t sz;DIR *dp;int fd;//獲取相對路徑名返回的文件描述符fdif((dp = opendir(argv[2])) == NULL){perror("opendir");exit(EXIT_FAILURE);}if((fd = dirfd(dp)) < 0){perror("dirfd");exit(EXIT_FAILURE);}//創建符號鏈接if(symlinkat(argv[1],fd,argv[3]) < 0){perror("symlinkat");exit(EXIT_FAILURE);}//讀取符號鏈接bzero(buf,sizeof(buf));if((sz = readlinkat(fd,argv[3],buf,sizeof(buf))) < 0){perror("readlinkat");exit(EXIT_FAILURE);}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 <stdio.h>#include <unistd.h>int remove(const char *pathname);對于文件remove的左右和unlink的作用是一樣的,但是對于目錄來說使用remove相當于使用rmdir 即刪除目錄。
#include <stdio.h>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函数(文件硬链接和软连接)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 作者:张群(1988-),女,博士,中
- 下一篇: 客座编辑:黎建辉(1973-),男,博士