日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux文件-link函数(文件硬链接和软连接)

發布時間:2025/3/15 linux 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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);兩個函數返回值:若成功,返回讀取的字節數;若出錯,返回-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 <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函数(文件硬链接和软连接)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。