我正在閱讀The Unix Programming Environment,根據這本書,UNIX 目錄是包含檔案名串列及其 inode 編號的檔案。根據書中的示例,可以像運行od -c .一個簡單的檔案一樣運行并獲取當前作業目錄的內容。
然而,自從這本書于 1984 年出版并運行上述命令輸出以來,事情似乎發生了變化od: .: Is a directory。這是在運行 macOS 12.0.1 的機器上運行的,但是我猜這種行為在其他現代 UNIX 派生作業系統中是相同的。
我的問題是,究竟發生了什么?目錄不再是檔案了嗎?如果是的話,一切都是檔案原則發生了什么?如果沒有,為什么不能像讀取檔案一樣讀取目錄的內容?
uj5u.com熱心網友回復:
現代 Unix 系統仍然允許行程像打開任何其他檔案一樣打開目錄。它們只是無法讀取或寫入。目錄并不是唯一一種既不允許讀也不允許寫的檔案:許多作業系統的設備檔案支持某些ioctl,但既不支持read也不支持write.
錯誤“是一個目錄”來自read系統呼叫,而不是來自open.
$ perl -e 'sysopen D, ".", 0 or die "open: $!"; sysread D, $a, 42 or die "read: $!"'
read: Is a directory at -e line 1.
最早的 Unix 系統在內部將目錄視為常規檔案。要列出目錄的內容,行程可以讀取檔案,標準庫中的代碼知道如何解碼檔案系統格式并將一堆位元組轉換為檔案名和屬性串列。
當 Unix 系統開始支持多個檔案系統時,這不再擴展。不同的檔案系統型別以不同的方式對目錄內容進行編碼。對于網路檔案系統,目錄的內容可以在不同的機器上進行不同的編碼,因此應用程式不能再期望所有目錄都采用本地標準格式,除非內核為它們進行翻譯。
一些 Unix 系統仍然允許行程讀取目錄,但內容只是一個沒有保證意義的位元組流,或者能力僅限于其本地檔案系統上的目錄。許多現代系統(至少 Linux、FreeBSD 和 macOS)完全禁止從目錄中讀取。
現代檔案系統變得越來越復雜,不一定將目錄表示為位元組序列。一些檔案系統允許將小檔案的內容直接存盤在目錄資料結構中,在這種情況下,內核不允許讀取目錄,因為有權限讀取目錄的讀者不一定有讀取目錄的權限。其中的檔案。
一旦非特權行程的概念出現,就禁止非特權行程寫入目錄檔案,因為這很容易使檔案系統不一致,然后甚至禁止特權行程,因為兩個行程同時編輯目錄可能會進行沖突的更改,使檔案系統不一致。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/380101.html
