如何理解「Unix裡一切都是檔案」這句話?

2021-09-17 20:30:17 字數 3072 閱讀 9209

unix作業系統的設計、使用者介面、文化和演變都是建立在它的一套統一的想法和概念上。其中最重要的一點可能是「一切皆檔案」,而這個概念被認為是unix的靈魂之一。

\\ 這一關鍵設計原則提供了乙個統一的正規化,用於訪問各種輸入輸出資源:文件、目錄、磁碟驅動器、cd-rom、數據機、鍵盤、印表機、顯示器、終端,甚至是一些程序間通訊和網路通訊。所有這些資源擁有乙個通用的抽象,unix之父將其稱為「檔案」。因為每個「檔案」都通過相同的api暴露出來,所以你可以使用同一組基本命令來讀取和寫入磁碟、鍵盤、文件或網路裝置。

\\ 這個基本概念實際上有雙重含義:

\\\\

那麼unix中的檔案是由什麼組成的?檔案只不過是可以讀取和寫入的普通位元組的集合。如果你持有乙個檔案引用(也就是檔案描述符),就可以使用相同的一組api進行io操作,無論裝置的型別和底層硬體是什麼。

\\ 縱觀歷史,unix是第乙個對所有io操作進行統一抽象並提供一小組操作原語的作業系統。當時,大多數作業系統為每種裝置或裝置家族提供單獨的api。一些早期的微型計算機作業系統甚至要求你使用多個使用者命令來複製檔案——不同大小的軟盤需要使用不同的命令!

\\ 從程式設計師和使用者的角度來看,unix通過位元組流的形式暴露了如下的資源:

\\ 儲存在磁碟上的文件、目錄、鏈結、大容量儲存裝置(如磁碟驅動器、cd-rom、磁帶、usb)、程序間通訊(例如管道、共享記憶體、unix套接字)、網路連線、互動式終端、其他裝置(如印表機、圖形卡)。使用者可以對這些位元組流進行讀(read)、寫(write)、隨機訪問(lseek)和關閉(close)操作。

\\ 統一的api對於unix程式來說非常重要:你可以盡情地開發乙個處理檔案的程式,卻不需要知道檔案內容究竟是來自**,它們可能儲存在本地磁碟或網路某處的遠端驅動器上,或者是通過網路流入、由使用者輸入,甚至是由另乙個程式在記憶體中生成。這大大降低了程式的複雜性,並簡化了開發人員的學習曲線。這一基本特性讓程式開發變得輕而易舉(你只需與兩個特殊檔案打交道:標準輸入和標準輸出)。

\\ 不過需要注意的是,雖然所有檔案都提供了統一的api,但某些特定型別的裝置可能不支援某些操作。例如,你無法對滑鼠裝置進行lseek操作,也無法在cd-rom裝置上進行write操作(假設你的cd是唯讀的)。

\\\\

在unix中,檔案不只是具有統一api的位元組流,還可以通過統一的方式來引用它們:檔案系統就是統一的命名空間。

\\\\

unix的檔案系統路徑提供了統一的模式來標記資源,無論其性質如何。例如,你可以使用/usr/local引用本地目錄,使用/home/joe/memo.pdf引用乙個檔案,使用/mnt/cdrom引用cd-rom,使用/usr引用網路驅動器上的目錄,使用/dev/sda1引用乙個磁碟分割槽,使用/tmp/mysql.sock引用unix域套接字,使用/dev/tty0引用終端,或使用/dev/mouse引用滑鼠。這個全域性命名空間通常被視為檔案和目錄的層次結構。檔案路徑可以引用幾乎任何東西:檔案系統、裝置、網路共享或通訊通道。

\\ 命名空間是分層的,所有資源可以從根目錄(/)開始引用。你可以訪問同一命名空間內的多個檔案系統:只需要將其他裝置或檔案系統(如外部磁碟驅動器)「附加」到命名空間的某個位置(如/backups)。在unix術語中,這個操作叫作掛載(mount)檔案系統,而掛載檔案系統的位置稱為掛載點(mount point)。你可以將掛載檔案系統裡的所有資源視為全域性命名空間的一部分,只要在訪問這些資源時使用掛載點作為字首(例如/backups/myproject-oct07.zip)。

\\ 掛載機制對於建立統一而連貫的命名空間來說至關重要,在這種命名空間中,異構資源可以重疊。而在微軟的作業系統中,ms-dos和windows也將裝置視為檔案,但沒有將檔案系統視為統一的命名空間。它們的命名空間是分割槽的,每個物理儲存位置都被視為乙個不同的實體:c:\\是第乙個磁碟驅動器,e:\\是cd-rom裝置,等等。

\\\\

在早期,unix通過提供全域性api並將裝置放入統一的檔案系統命名空間,極大促進了輸入輸出資源的整合。這種方法非常成功,以至於越來越多的資源和系統服務被作為檔案系統全域性命名空間的一部分。plan 9作業系統開創了這一壯舉,現在已經出現在了所有的現代unix系統中。

\\ 這種方式導致出現了大量的偽檔案系統,它們的行為類似於普通檔案系統,但可用於訪問與傳統檔案系統不直接相關的資源。例如,你可以使用偽檔案系統來查詢和控制程序、訪問核心或建立tcp連線。這些偽檔案系統提供了檔案系統語義,用於表示結構化的資訊,並為各種物件提供統一的訪問方式。偽檔案系統(有時也稱為虛擬檔案系統)通常沒有實際的物理儲存,它們是基於記憶體的。

\\ 偽檔案系統示例:

\\\\

在現代unix作業系統中,所有的裝置和大多數程序間通訊都被視為檔案系統層次結構中的檔案或偽檔案。這種unix願景和設計原則被稱為「一切皆檔案」,是unix保持成功和長青的關鍵因素之一。它提供了乙個強大而簡單的抽象,作為系統、工具和社群的構建基礎。更重要的是,它提供了強大的整合和基本的組合機制,通過連線工具和應用程式來解決眼前的問題。

\\ 儘管「一切皆檔案」的理念取得了成功,但有些人對它的普遍適用性持懷疑態度。如果說檔案被視為位元組流,那麼就會缺少對元資料的支援:為了能夠正確地處理檔案,應用程式必須使用自己的方法來確定檔案的型別、結構和語義。此外,為了保留元資料,處理檔案的工具必須保持元資料不變(例如的xmp資訊)。因此,儘管將unix檔案視為位元組流對於基於文字介面的程式互動來說非常有用,但在處理多**和二進位制檔案方面卻帶來了嚴重的侷限性。

\\ 儘管存在侷限性,但大多數人仍然承認這個理念所具備的強大威力以及它對作業系統整合產生的巨大影響。自unix首次發布以來,研究人員一直在努力推廣這一核心理念。例如,plan 9作業系統率先對系統資源採用了完全整合的方法:不僅是裝置和通訊渠道,所有的系統介面都使用檔案系統來表示。例如,plan 9的設計者指出,在unix系統中,網路裝置不能完全被視為常規檔案:用於訪問它們的套接字具有不同的開放語義,並且位於不同的命名空間中(套接字的主機和埠)。plan 9的實現證明了我們可以成功地將所有本地和遠端裝置統一到全域性命名空間中。這個概念最終以portalfs的形式回到了unix上。

\\ plan 9的其他創新概念建立在「一切皆檔案」的原則之上。例如,plan 9在統一命名空間的基礎上提供了另一層抽象:可以為每個使用者或每個程序定製檔案系統命名空間,甚至可以動態調整。最後,plan 9證明了「一切皆檔案」這一理念可以在更大的範圍內實現。事實上,這一基本概念在現代unix作業系統中得到了進一步的擴充套件。

\\ 英文原文:

linux 一切都是檔案 一切都是檔案

linux 一切都是檔案 這是給您乙個技巧性的問題 以下哪些檔案?也許您不會相信這一點,但是對於unix和linux來說,它們都是檔案。這是最令人驚奇的概念之一,它使一些非常簡單但功能強大的方法能夠執行許多本來很難或不可能的管理任務。例如,考慮備份硬碟驅動器主啟動記錄 mbr 的簡單任務。有時,我需...

linux系統中一切都是檔案如何理解?

linux系統中一切都是檔案如何理解?linu系統中硬碟裝置會被抽象成檔案,這些抽象成的檔案如何命名的?如何從檔名稱知道是哪個硬體?linux系統核心中的udev裝置管理器會自動把硬體名稱規範起來,目的是讓使用者通過裝置檔案的名稱可以猜出裝置大致的屬性以及分割槽資訊 對硬碟而言 udev裝置管理器會...

一切都是代名詞

一切都是代名詞,想想你所知道的,所想的,要表達出來總得有抽象的語言說出來。既然說出來都是代指一切事物,僅僅聽到的代名詞本身,指的是卻是名詞後面的事情。就像 我 這個代名詞,只要一說出來第一反應是自己吧,聽到別人說時第一反應是對方了,為什麼別人說 我 時就不反應一下自己呢?經常聽一些想成功的人,不斷的...