2017-08-12 88 views
1

解析Linux上符號鏈接的算法應該是什麼樣子?解析符號鏈接算法

喜歡的東西:

  1. 拆分路徑步驟/usr/bin/hello - >['usr', 'bin', 'hello']

  2. 首先解決/usr - >/something1

  3. 添加下一步和解決/something1/bin - >/something2

  4. 添加下一個步驟,解決/something2/hello - >/something3

請問這項工作?

+2

通過「解決」,你的意思是形成一個路徑到不包含符號鏈接的文件?在這種情況下,你必須提供一些額外的細節,包括(1)符號鏈接可以指向另一個符號鏈接; (2)符號鏈接可以指向多組件路徑(其任何組件可以是符號鏈接); (3)符號鏈接可以是絕對鏈接或相對鏈接; (4)符號鏈接可以指向一個不存在的路徑。 –

+0

@JohnBollinger他們可以遞歸嗎? – Vad

+0

「遞歸」是什麼意思? – melpomene

回答

1

你實際上在尋找的是readlink命令,它依賴於POSIX realpath。它的算法可here

寫在一本書的想法是這樣的:

所有路徑類型分辨率(檢查)處理使用斜線(/)的存在或不存在指示是否路徑是絕對的還是相對的路徑。如果存在斜線,則將斜槓後面的第一個限定符與MVS前綴進行比較,以確定它是否與前綴匹配。如果是這樣,那麼路徑類型將被視爲通過前綴明確解析。如果找不到匹配,或者不存在斜線,則使用隱式路徑類型分辨率啓發式。

一些細節也可here

1

基本上,當你請求一個I/O,內核要經過一系列的步驟。內核需要搜索所需文件的目錄,這不是問題,因爲內核始終知道從哪裏開始,因爲根文件具有一個不變的inode編號,它是inode 2文件系統的ext系列。一旦內核找到目錄中的文件名,內核就會將文件名轉換爲inode編號。由於每個目錄只是一種特殊的文件,它通過(文件名,inode)字段保存每個條目的條目,通過搜索目錄,內核將能夠找到文件的inode。

一旦內核發現文件的inode,這個inode就會保存常規文件的塊地址,因此將用於查找存儲在該文件中的數據。文件的塊地址保存存儲在文件中的實際數據。 *常規文件和符號鏈接文件的區別在於,符號鏈接文件是指向另一個位置的文件,因此內核必須執行兩次相同的一系列步驟,也就是說,當找到符號鏈接文件的inode時內核必須重新執行符號鏈接文件指向的文件路徑的相同操作,它必須在目錄中搜索並在目錄中查找匹配的文件名以獲取inode編號。這顯然增加了開銷。

遞歸(a.k.a cyclic)符號鏈接是無效的符號鏈接。

不知道我是否已經回答了您的問題,但通常情況下,您的頂部和下方都有VFS層,即物理文件系統。有些文件系統甚至不支持符號鏈接,比如vfat。