譯 在 UNIX 中,一切皆檔案

2022-06-30 04:36:10 字數 3329 閱讀 4041

譯文出自:掘金翻譯計畫

譯者:pmwangyang

為了有計畫的發展架構設計、介面、文化和開發路線,unix 系統明確了一系列統一的概念和創想。這幾點裡面最重要的一點莫過於一句咒語:「一切皆檔案」,被廣泛認為是 unix 的定義之一。

暴露,所以你可以用同一套命令來讀寫/操作磁碟、鍵盤、檔案或網路裝置。

這個基本概念有兩種含義:

」),那麼 unix 的 i/o 通道就已經準備好了,他們有著同樣的一套操作和 api —— 無論裝置的型別如何、底層硬體是什麼。

縱觀歷史,unix 是第乙個把 i/o 抽象成乙個統一的概念和一系列原語的系統。那時,大部分作業系統為每一種或一類裝置提供不同的 api。一些早期的微型計算機作業系統甚至需要你使用多個命令去拷貝檔案 —— 因為每個命令對應指定的軟盤大小!

對於大多數程式設計師和使用者來說,unix 向他們暴露了:

對於位元組流這種形式你可以:

統一的 api 特性對於 unix 程式來說是基礎也是非常有效的:在 unix 中你可以很很輕鬆地編寫乙個處理檔案的程式,因為不需要關心檔案是儲存在本地磁碟中、儲存在遠端網路驅動器上、在網際網路中傳播、通過使用者互動輸入,還是通過其他程式在記憶體中生成。這顯著降低了程式的複雜性、減緩了開發者的學習曲線。並且,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 術語來說,這個操作叫做掛載(mounting)乙個檔案系統,你連線檔案系統的命名空間位置叫做掛載點(mount point)。你可以通過給掛載的檔案系統中的所有資源新增以掛載點命名的字首,就像訪問通用命名空間的一部分一樣,來訪問它的所有資源(比如/backups/myproject-oct07.zip這個檔案)。

當不同的資源會被明顯覆蓋的情況下,我剛剛描述的掛載機制在建立乙個統一的、明確的命名空間時就至關重要。對比一下這種命名空間和微軟作業系統中的檔案系統命名空間 —— ms-dos 和 windows 把裝置視為檔案但是不會把檔案系統放在通用命名空間中,它的命名空間是分割槽的並且每個物理儲存位址被視為獨特的實體[3]

c:\是第乙個硬碟,e:\是 cd-rom 裝置等等。

早期,unix 因為提供全域性 api 以及將裝置掛載到統一的檔案系統命名空間的特性,大幅提公升了輸入/輸出資源的整合度。這個方法是如此成功,以至於從那時開始有一種將更多資源和系統服務暴露為檔案系統全域性命名空間的趨勢。plan 9 是這種做法的先驅,而現在所有新的 unix 系統都這麼做了。

這種方法導致產生了許多偽檔案系統,這些系統看起來和一般的檔案系統一樣,但是可以訪問沒有直接關聯傳統檔案系統的資源。比如你可以使用偽檔案系統來查詢控制程序、訪問核心內部或建立 tcp 連線。這些偽檔案系統具有檔案系統語義,可以展示分層資訊,並為大部分物件提供了統一訪問的方式。偽檔案系統有時也被稱為虛擬檔案系統,特點是沒有物理裝置也沒有備份儲存器,只依靠記憶體來工作。

偽檔案系統的例子:

能夠通過檔案系統語義進行管理的系統資源究竟涉及多麼大的範圍,上面的例子可以讓你對有乙個清楚的認識了。

在現代的 unix 作業系統中,所有裝置和大部分程序間通訊在檔案系統層級都以檔案或偽檔案的形式檢視和管理。「一切皆檔案」的 unix 基礎願景和設計原則,是 unix 成功和長久的關鍵因素。它提供了乙個有力、簡單的抽象,使得系統、工具和社群可以在其之上建立。更重要的是它用一種專有的方式來解決問題,那就是為鏈結工具和應用提供了強有力的整合和基礎組合機制。

儘管「一切皆檔案」這個比喻很成功,但是一些人或多或少懷疑它的普遍性。當每個檔案都被視為位元組流時,產生的乙個後果就是元資料缺少標準支援:為了合適地處理乙個檔案,每個應用必須想辦法計算檔案型別、架構和語義。並且,為了儲存元資料,每個處理資料流的工具必須保持元資料不變(比如**中的 xmp 資訊)。因此,儘管 unix 檔案的一大堆位元組的形態對於鏈結文字介面的程式極度高效,同時也嚴重限制了多**和二進位制應用的組合。

儘管它有它的限制,但很多人也承認這個比喻的影響力,和它在作業系統一體化上的效果。自從 unix 第一次發布以來,研究者們持續推進這一中心思想。比如 plan 9 作業系統倡導乙個將系統資源完全整合的方法:plan 9 願景的基礎就是這樣的目標 —— 不僅僅裝置和通道,而是將所有系統介面通過檔案系統代表。比如 plan 9 的設計人員注意到在 unix 中,網路裝置不能完全地被視為合格的檔案:它們通過套接字訪問,而套接字有特有的開啟語義並且屬於乙個不同的命名空間(網際網路套接字的主機和埠)。plan 9 實現並且證明了,你可以在乙個全域性命名空間裡成功的統一所有本地和遠端裝置。這個想法最終以portalfs的形式在 unix 中實現。

其他**於 plan 9 的創新的概念也是基於「unix 中,一切皆檔案」原則建立的。比如 plan 9 在統一命名空間設計之上提供了另乙個抽象層:檔案系統命名空間可以被每個使用者、每個程序自定義,甚至動態調整[4]

。最後,plan 9 證明了「unix 中,一切皆檔案」這個比喻,可以被在更大的層面上實現。事實上,這個基礎概念在現代 unix 作業系統中正被繼續發揚光大[5]

UNIX一切皆檔案!!

忘記從 聽到這樣一句話,unix一切皆檔案。下面是我的理解,這句話真的unix最精髓的一句話!我在研究管道的時候,用到popen和pclose,這裡popen返回值是file fp,大多是理解成管道,可以跟子程序的標準輸入輸出重定向,如果這裡把它看成是乙個檔案,那麼無非就是對這個檔案的寫或讀,無非這...

Linux中一切皆檔案

linux系統中一切皆檔案是乙個基本哲學。建立此貼希望以在學習中能以這個哲學基礎為中心,展開思路進行融會貫通。檔案型別 字元 檔案例項 常規檔案 二進位制檔案 純文字 xml 壓縮檔案等 目錄檔案 d資料夾 字元裝置 ccharacter device,如串列埠 鍵盤 滑鼠 eeprom等,以cha...

python中一切皆物件

動態語言和靜態語言的區別 函式和類也是物件,屬於python的一等公民 特性 定義乙個函式,並把這個函式賦值給乙個變數,此時這個變數可以作為乙個函式使用 defask name bobby print name my func ask my func bobby 定義乙個類,同樣可以使用這樣的操作,...