題 為什麼根目錄'/'引用了它的“父”?


我正在為瀏覽器遊戲開發一個假文件系統。 我最近實現了“..”和“。”文件夾,所以每個文件夾都有對其父文件的引用。 然後我檢查了我的終端,如果“/”也有這些文件夾。 實際上我很驚訝它有一個目錄“..”,這顯然是對自己的引用。

這種一致性的原因還是有更好的解釋?

編輯: 我基本上都在尋找記錄在案的文件。


6
2017-08-28 10:55


起源


沒有直接相關但也看到了 unix.stackexchange.com/questions/61984/... - deepak
重複的 unix.stackexchange.com/questions/5711/why-does-have-an-entry - deepak
大。謝謝你的鏈接。但我的問題仍未得到解決。答案都“猜測”是因為一致性。 - Julian Hollmann
順便說一句LFS沒有說'..'和''。 tldp.org/LDP/Linux-Filesystem-Hierarchy/html/... - deepak
@JourneymanGeek它不會。這是我的全部觀點。 “..”只是父文件夾的硬鏈接。如果它不存在你就無法進入它。 - Julian Hollmann


答案:


有這個 POSIX定義 :

3.144空目錄

最多包含目錄條目的目錄  和    點 - 點,確切地說 一個鏈接到它 (除了自己的點條目,如果存在的話), 在點 - 點

在所有文件命令的POSIX描述中,使用不同的措辭重複該定義。
例如 命令rmdir :

空目錄的定義最多包含一個目錄   點和點的目錄條目。

對於空目錄的上述複雜定義顯然是在這個有趣的約定背後,其目的是避免規則的任何例外,甚至不是斜杠(/)。


3
2017-08-30 18:59





單一UNIX規範 狀態:

作為一種特殊情況,在根目錄中,dot-dot可以指向根目錄本身。

標準中沒有說明理由。官方的“為什麼?”回答,你可能需要直接問肯湯普森。


5
2017-08-30 11:29



我想我需要接受,謝謝。 - Julian Hollmann


文件系統遍歷。

當你在Unix系統上查看文件名時,你正在查看一個有根的樹。

當您查看文件時,它位於目錄中。您可以通過上一級(...)並檢查您所在目錄的inode來詢問該目錄是什麼。然後重複,您可以在任何地方建立起來。但是當你到達根部時,就沒有了。只有'這裡'。通過設置 '。'和'..'為相同的值,您設置一個唯一的信號,該文件系統中沒有其他目錄可以擁有。它是根。

當您將文件系統掛載到另一個掛載點時 - 您在另一個磁盤上有/ home文件系統,例如,您通過引用根文件系統上的掛載點來覆蓋'..'。所以掛載的文件系統root曾經有一個'。'和'..'相同,現在有不同的價值觀。

有'。'和'..'重複相同的數據是一個重要的,獨特的信號,僅適用於樹的頂部。這告訴遍歷程序他們可以停止尋找父節點。

我認為有相關的文件 獅子會評論Unix內核版本6。圍繞第84頁,它描述瞭如何處理掛載點。


3
2017-09-02 15:15





我喜歡給出的其他答案,並且會添加使得這對我有意義的部分(至少對我而言)是目錄實際上是特殊類型的文件。 UNIX中的任何“特殊”類型的文件都需要使其符合其“特殊”類型分類的屬性。如果沒有所有這些屬性,系統可能無法識別它應該是什麼或可能誤解它。您可以使用比如vim將目錄視為文件。例如,如果你用vim查看系統中的任何目錄,

$ vim ~

你會看到那個“文件”中列出的第一個未註釋的東西是“../”,也就是說,這個特殊文件中列出的第一件事是父目錄,正如你所料,它的父級是一個級別“up” 。但如果你改為嘗試

$ vim /

你會在第一個未註釋的行上看到它說“./”而不是“../”。為什麼差異以及它為什麼必須在這裡? “/”必須列出“父”,以符合被識別為“目錄”類型的特殊文件的要求。首先沒有這個列表,就好像“/”有一個不同的父指定(即,“/”特殊文件中的第一個),我懷疑(但尚未確認)這將導致其中一個孩子被解釋為它的父級,在文件系統中創建一個循環,即它不再是一個有根文件的系統,而是一個循環的文件系統!換句話說,如果系統總是將“目錄文件”中的第一個條目解釋為“此目錄的父級”,則“/”必須具有適當的第一個列表以便正確解釋。


1
2017-09-03 05:31



這個答案沒有多大意義。是的,某些編輯器允許您通過“打開”目錄來查看目錄的內容。其他人沒有。是的,內部目錄通常表示為具有某些屬性集的某種類型的“特殊”文件,以及從中引用的一些給定條目集,但我懷疑這些條目的磁盤(甚至枚舉)中的順序是拼寫出來的任何設計必須適用於不同操作系統和體系結構的標準。 - α CVn
一個目錄 .. 入口指向目錄的父級;在那棵樹的根部 是 沒有父母。那麼簡單的解決方案就是擁有 .. 指向它所包含的目錄。 (這也意味著當您將該文件系統掛載到非根位置時, .. 可以動態更新以指向父級;無需創建其他目錄條目。) - α CVn