目錄的八進制轉儲
我從一次舊貨銷售中得到了 Kernighan 和 Pike 的《Unix 程式環境》的副本。我對有關 UNIX 文件系統的章節非常感興趣。當然,我也覺得這段話很有趣:
是時候查看目錄中的字節了:
$ od -cb . 0000000 4 ; . \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 \0 064 073 056 000 000 000 000 000 000 000 000 000 000 000 000 000 ....
真的很長,所以我不會把整件事都寫出來。它的要點是它以儲存在系統上的方式顯示目錄。我迅速沖到我的筆記型電腦(Debian)上嘗試一下。我輸入了書中的命令。
$ od -cb . od: .: read error: Is a directory 0000000
顯然它不會讓我查看目錄的原始內容。所以這是我的問題。
Linux 核心儲存目錄的方式是否與原始 UNIX 核心不同?如果不是,為什麼需要對使用者隱藏目錄的實際字節?
每種文件系統類型以不同的方式儲存目錄。有許多不同的文件系統類型具有不同的特性——有利於高吞吐量、有利於高並發、有利於記憶體有限的環境、讀寫性能之間、複雜性和穩定性之間的不同折衷等等。你的書描述了早期使用的文件系統Unix系統。現代系統支持許多不同的文件系統。
Unix 的早期版本在核心之外有很多文件系統操作。例如,
mkdir
通過rmdir
直接編輯一些文件系統資料結構來工作。這很快被統一的目錄訪問介面opendir
/readdir
/closedir
系列所取代,它允許應用程序操作目錄而無需知道它們是如何在後台實現的。Linux下不能讀取目錄內容的原因不是因為它們必須被隱藏,而是因為特性只有實現了才存在,而這個特性是沒有意義的,而且是有代價的。鑑於格式取決於文件系統,這是一個相當無意義的功能:程序無法知道它正在讀取的內容的格式。支持它也不是一個完全微不足道的功能:一些文件系統以不僅僅是字節流的方式組織目錄,例如它可能被組織為B-tree。一些 Unix 變體仍然允許應用程序直接讀取目錄內容,以實現向後兼容性,但 Linux 沒有此功能(據我回憶,從未有過 — 它在 1990 年代初期已經過時)。