yfan.qiu linux硬鏈接與軟鏈接

http://www.cnblogs.com/yfanqiu/archive/2012/06/11/2545556.html

Linux 系統中有軟鏈接和硬鏈接兩種特殊的“文件”。

軟鏈接可以看作是Windows中的快捷方式,可以讓你快速鏈接到目標檔案或目錄。

硬鏈接則透過文件系統的inode來產生新檔名,而不是產生新檔案。

創建方法都很簡單:

  1. 軟鏈接(符號鏈接) ln -s?? source? target?
  2. 硬鏈接 (實體鏈接)ln ? ? ? source ?target

inode

要解釋清楚兩者的區別和聯系需要先說清楚 linux 文件系統中的 inode 這個東西。當劃分磁盤分區并格式化的時候,整個分區會被劃分為兩個部分,即inode區和data block(實際數據放置在數據區域中)這個inode即是(目錄、檔案)文件在一個文件系統中的唯一標識,需要訪問這個文件的時候必須先找到并讀取這個文件的 inode。 Inode 里面存儲了文件的很多重要參數,其中唯一標識稱作 Inumber, 其他信息還有創建時間(ctime)、修改時間(mtime) 、文件大小、屬主、歸屬的用戶組、讀寫權限、數據所在block號等信息。

通常會根據分區的用途來安排inode的數量(這是另外一個話題了),比如文件數量很多而文件都很小,則需要調增inode較大,以便能索引全部文件。否則將會出現這個分區并沒有寫滿而無法寫入任何文件的情況。

?

目錄文件與檔案文件

目錄文件:記錄該目錄下的文件名

檔案文件:記錄實際文件數據

inode本身并不記錄文件名,文件名記錄在目錄文件的block當中,所以新增、刪除、更改文件名與目錄的W權限有關。因此當我們要讀某個檔案時,就務必經過其目錄的inode和block,然后才能夠找到待讀取檔案的inode號,最終才會讀到正確的檔案block內的數據。系統是通過索引節點(而不是文件名)來定位每一個文件。

目錄inode(滿足權限?) => 目錄block => 檔案inode(滿足權限?) => 檔案block

硬鏈接

多個檔名對應同一個inode,硬鏈接只是在某個目錄下新增一筆檔名鏈接到某個inode號碼的關聯記錄而已。如果將上圖中任何一個檔名刪除,檔案的inode與block都還存在,依然還可以通過另一個檔名來讀取正確的檔案數據。此外,不論用哪一個檔名來編輯,最終的結果都會寫入相同的inode和block中,因此均能進行數據的修改。

軟連接

軟連接就是建立一個獨立的文件,而這個文件會讓數據的讀取指向它link的那個檔案的檔名,由于只是作為指向的動作,所以當來源檔案被刪除之后,軟連接的檔案無法開啟,因為找不到原始檔名。連結檔的內容只有檔名,根據檔名鏈接到正確的目錄進一步取得目標檔案的inode,最終就能夠讀取到正確的數據。如果目標檔案的原始檔名被刪除了那么整個環節就進行不下去了。

?

下面用一個實例來說明硬鏈接和軟鏈接。

現在目錄下有兩個文件,一個名為AAA,一個名為BBB。
引用
$ ls -il
963922 -rw-r--r-- 1 ocean ocean 92 2007-05-18 15:46 AAA
963923 -rw-r--r-- 1 ocean ocean 95 2007-05-18 15:46 BBB


首先先做一個AAA的硬鏈接。
引用
$ ln AAA AAAhard
$ls -il
963922 -rw-r--r-- 2 ocean ocean 92 2007-05-18 15:46 AAA
963922 -rw-r--r-- 2 ocean ocean 92 2007-05-18 15:46 AAAhard
963923 -rw-r--r-- 1 ocean ocean 95 2007-05-18 15:46 BBB

這里我們注意在創建鏈接前,AAA顯示的鏈接數目為1,創建鏈接后
1.AAA和AAAhard的鏈接數目都變為2。
2.AAA和AAAhard的inode號是一樣的,都是963922。
3.AAA和AAAhard顯示的文件大小也是一樣,都是92B。
可見進行了ln命令的操作結果:AAA和AAAhard是同一個文件的兩個名字,它們具有同樣的索引節點號和文件屬性,建立文件AAA的硬鏈接,就是為 AAA的文件索引節點在當前目錄上建立一個新指針。你可以刪除其中任何一個,如rm AAA,每次只會刪除一個指針,鏈接數同時減一,只有將所有指向文件內容的指針,也即鏈接數減為0時,內核才會把文件內容從磁盤上刪除。

盡管硬鏈接節省空間,也是Linux系統整合文件系統的傳統方式,但是存在一些不足之處:
1.不允許給目錄創建硬鏈接。
2.不可以在不同文件系統的文件間建立鏈接。
因為 inode 是這個文件在當前分區中的索引值,是相對于這個分區的,當然不能跨越文件系統了。

接著我們做一個指向BBB的軟鏈接,軟鏈接克服了硬鏈接的不足,沒有任何文件系統的限制,任何用戶可以創建指向目錄的符號鏈接。因而現在更為廣泛使用,它具有更大的靈活性,甚至可以跨越不同機器、不同網絡對文件進行鏈接。
引用
$ ln -s BBB BBBsoft
$ ls -il
總用量 0
963922 -rw-r--r-- 2 ocean ocean 92 2007-05-18 15:46 AAA
963922 -rw-r--r-- 2 ocean ocean 92 2007-05-18 15:46 AAAhard
963923 -rw-r--r-- 1 ocean ocean 95 2007-05-18 15:46 BBB
963924 lrwxrwxrwx 1 ocean ocean 3 2007-05-18 15:47 BBBsoft -> BBB

從上面鏈接后的結果可以看出來軟鏈接與硬鏈接,區別不僅僅是在概念上,在實現上也是完全不同的。

區別:
1.硬鏈接原文件/鏈接文件公用一個inode號,說明他們是同一個文件,而軟鏈接原文件/鏈接文件擁有不同的inode號,表明他們是兩個不同的文件;
2.在文件屬性上軟鏈接明確寫出了是鏈接文件,而硬鏈接沒有寫出來,因為在本質上硬鏈接文件和原文件是完全平等關系;
3.鏈接數目是不一樣的,軟鏈接的鏈接數目不會增加;
4.文件大小是不一樣的,硬鏈接文件顯示的大小是跟原文件是一樣的。而這里軟鏈接顯示的大小與原文件就不同了,BBB大小是95B,而BBBsoft是3B。因為BBB共有3個字符

5.軟鏈接沒有任何文件系統的限制,任何用戶可以創建指向目錄的符號鏈接

總之,建立軟鏈接就是建立了一個新文件。當訪問鏈接文件時,系統就會發現他是個鏈接文件,它讀取鏈接文件找到真正要訪問的文件。

當然軟鏈接也有硬鏈接沒有的缺點:因為鏈接文件包含有原文件的路徑信息,所以當原文件從一個目錄下移到其他目錄中,再訪問鏈接文件,系統就找不到了,而硬鏈接就沒有這個缺陷,你想怎么移就怎么移;還有它要系統分配額外的空間用于建立新的索引節點和保存原文件的路徑。

分類:?Linux


本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/383805.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/383805.shtml
英文地址,請注明出處:http://en.pswp.cn/news/383805.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【Java學習筆記八】包裝類和vector

包裝類 在Java語言中,每一種基本的數據類型都有相應的對象類型,稱為他們基本類型的包裝類(包裹類)。 字節byte:Byte、短整數型short:Short 標準整數型int:Integer、長整數型long:Lo…

Linux C++線程池實例

http://www.cnblogs.com/danxi/p/6636095.html 想做一個多線程服務器測試程序,因此參考了github的一些實例,然后自己動手寫了類似的代碼來加深理解。 目前了解的線程池實現有2種思路: 第一種: 主進程創建一定數量的線程&#xff0…

Java編寫簡單的自定義異常類

除了系統中自己帶的異常,我們也可以自己寫一些簡單的異常類來幫助我們處理問題。 所有的異常命名都是以Exception結尾,并且都是Exception的子類。 假設我們要編寫一個人類的類,為了判斷年齡的輸入是否合法,我們編寫了一個名為Il…

shared_ptr簡介以及常見問題

http://blog.csdn.net/stelalala/article/details/19993425 本文中的shared_ptr以vs2010中的std::tr1::shared_ptr作為研究對象。可能和boost中的有些許差異,特此說明。 基本功能 shared_ptr提供了一個管理內存的簡單有效的方法。shared_ptr能在以下方面給開發提供便…

【Java學習筆記九】多線程

程序:計算機指令的集合,它以文件的形式存儲在磁盤上,是應用程序執行的藍本。 進程:是一個程序在其自身的地址空間中的一次執行活動。進程是資源申請、調度和獨立運行的單位,因此,它使用系統中的運行資源。而…

【C++11新特性】 C++11智能指針之weak_ptr

http://blog.csdn.net/xiejingfa/article/details/50772571 原創作品,轉載請標明:http://blog.csdn.net/Xiejingfa/article/details/50772571 如題,我們今天要講的是C11引入的三種智能指針中的最后一個:weak_ptr。在學習weak_ptr之…

【C++學習筆記四】運算符重載

當調用一個重載函數和重載運算符時,編譯器通過把您所使用的參數類型和定義中的參數類型相比較,巨鼎選用最合適的定義。(重載決策) 重載運算符時帶有特殊名稱的函數,函數名是由關鍵字operator和其后要重載的運算符符號…

【C++11新特性】 C++11智能指針之unique_ptr

原創作品,轉載請標明:http://blog.csdn.net/Xiejingfa/article/details/50759210 在前面一篇文章中,我們了解了C11中引入的智能指針之一shared_ptr,今天,我們來介紹一下另一種智能指針unique_ptr。 unique_ptr介紹 uni…

C++派生類對象和基類對象賦值

在C中,我們允許 將派生類對象賦給基類對象。(不允許將基類對象賦給派生類對象) 只會將基類對象成員賦值用基類指針指向派生類對象。(不允許用派生類指針指向基類對象) 基類指針只能操作基類中的成員基類引用作為派生類…

【C++11新特性】 C++11智能指針之shared_ptr

http://blog.csdn.net/Xiejingfa/article/details/50750037 原創作品,轉載請標明:http://blog.csdn.net/Xiejingfa/article/details/50750037 C中的智能指針首先出現在“準”標準庫boost中。隨著使用的人越來越多,為了讓開發人員更方便、更安…

C++(純)虛函數重寫時訪問權限更改問題

我們知道在Java中是自動實現多態的,Java中規定重寫的方法的訪問權限不能縮小。那么在C中我們實現多態的時候是否可以更改(縮小)訪問權限呢? 經過測試,得到的答案如下:如果用基類指針指向派生類對象實現多態…

C++ — 智能指針的簡單實現以及循環引用問題

http://blog.csdn.net/dawn_sf/article/details/70168930 智能指針 ____________________________________________________ 今天我們來看一個高大上的東西,它叫智能指針。 哇這個名字聽起來都智能的不得了,其實等你了解它你一定會有一點失望的。。。。因…

C++(靜態)(常量)數據進行初始化問題以及靜態變量析構

在C11標準以前我們都不可以在類中對數據成員初始化,僅能在構造函數中進行初始化: class A {int a,b; double c; string d;A():a(1),b(2),c(3),d(""){} };在C11標準以后我們可以在類中對非靜態成員進行初始化。實際上的機制是在調用構造函數的…

C++this指針的用法

參考博客&#xff1a;https://www.cnblogs.com/zhengfa-af/p/8082959.html 在 訪問對象的非靜態成員時會隱式傳遞一個參數&#xff0c;即對象本身的指針&#xff0c;這個指針名為this。 例如&#xff1a; class A {int a1;public:A(){}void GetA(int a){cout<<this-&g…

C++開發者都應該使用的10個C++11特性

http://blog.jobbole.com/44015/ 感謝馮上&#xff08;治不好你我就不是獸醫 &#xff09;的熱心翻譯。如果其他朋友也有不錯的原創或譯文&#xff0c;可以嘗試推薦給伯樂在線。】 在C11新標準中&#xff0c;語言本身和標準庫都增加了很多新內容&#xff0c;本文只涉及了一些皮…

C++不能被聲明為虛函數

虛函數是為了實現多態&#xff0c;但是顯然并不是所有函數都可以聲明為虛函數的。 不能被聲明為虛函數的函數有兩類&#xff1a; 不能被繼承的函數不能被重寫的函數 因此&#xff0c;這些函數都不能被聲明為虛函數 普通函數構造函數 如果構造函數定義為虛函數&#xff0c;則…

類的聲明與定義

類的前向聲明&#xff1a; class A;在聲明之后&#xff0c;定義之前&#xff0c;類A是一個不完全類型&#xff0c;即知道A是一個類&#xff0c;但是不知道包含哪些成員。不完全類型只能以有限方式使用&#xff0c;不能定義該類型的對象&#xff0c;不完全類型只能用于定義指向…

shared_ptr的一些尷尬

http://blog.csdn.net/henan_lujun/article/details/8984543 shared_ptr在boost庫中已經有多年了&#xff0c;C11又為其正名&#xff0c;把他引入了STL庫&#xff0c;放到了std的下面&#xff0c;可見其頗有用武之地&#xff1b;但是shared_ptr是萬能的嗎&#xff1f;有沒有什…

C++轉換構造函數和類型轉換函數

參考博客&#xff1a;https://blog.csdn.net/feiyanaffection/article/details/79183340 隱式類型轉換 如果不同類型的數據在一起操作的時候編譯器會自動進行一個數據類型轉換。例如常用的基本數據類型有如下類型轉換關系&#xff1a; 轉換構造函數 構造函數有且僅有一個參數…

C++總結8——shared_ptr和weak_ptr智能指針

http://blog.csdn.net/wendy_keeping/article/details/75268687 智能指針的提出&#xff1a;智能指針是存儲指向動態分配對象指針的類&#xff0c;用于生存期控制。能夠確保正確銷毀動態分配的內存&#xff0c;防止內存泄露。 1.智能指針的分類&#xff1a; 不帶引用計數的智能…