在Unix中,「一切都是位元組流」是什麼意思?

在Unix中,「一切都是位元組流」是什麼意思?

我是 Linux 的新手,在探索檔案系統時 - 我經常遇到這個短語“一切都是文件「。我確實看到了這個問題的答案這裡但我仍然無法理解這個概念。在答案中提到正是“一切都是位元組流

我不明白顯示器/鍵盤等表示為“位元組流”的含義。有人可以幫我想像一下嗎?

答案1

可以說,「一切都是文件」是口號。如果你願意的話,一個迷因。這並不完全正確。

顯然,硬體設備並不是像hello.txtext4 檔案系統上的實際檔案那樣。其中許多甚至與儲存設備沒有任何關係。

但即使不是一切都是文件,很多事情都可以訪問就像它們是文件,至少在某種程度上是文件。也就是說,它們在檔案系統樹中有一個名稱,並且可以對它們使用 和 系統呼叫read()write()如果我們考慮「一切都是位元組流」的感覺,後者尤其重要,因為這些呼叫存取位元組流。

由於相同的系統呼叫適用於常規檔案、原始磁碟設備、終端機、網路套接字和管道,因此可以使用相同的工具集。echo foo例如,無論輸出連接在哪裡,工作原理都是相同的。這可以簡化實用程式的實現,並且更容易將它們應用於新的目的。 shell 或其他命令列實用程式不需要執行任何特殊操作即可透過管道或套接字連接到 SSH 伺服器並透過網路存取。 (儘管對於互動式會話,SSH 創建了一個偽終端,因此它與本地會話沒有什麼不同。)

此外,當檔案系統中存在許多內容時,可以使用shell 重新導向 ( ) 列出ls並存取它們。這對於存取腳本中或從腳本存取特殊檔案非常有用,而無需特殊的二進位檔案來進行不太常見的系統呼叫。catecho foo > .../proc/sys

還沒一切是一個文件,或是一個位元組流,對於這些東西,並不是所有的事情都可以用read()and來完成write()。 UDP 套接字不是位元組流,因為它們傳輸固定大小的多位元組資料封包。 (儘管read()仍然write()可以處理它們,只是有點不同。)一些操作仍然需要透過ioctl()系統呼叫來完成,並且 ioctl 操作是特定於設備的。在 Linux 上,網路設備在檔案系統中沒有名稱。

另請參見例如

答案2

UNIX / Linux 系統中的所有內容都可以視覺化為某種輸入或輸出裝置。

磁碟是兩者兼而有之——您要么向其中寫入位元組流,要么從中讀取位元組流。鍵盤是一種輸入裝置 - 您從鍵盤讀取位元組流。

解釋此位元組流取決於目前使用鍵盤的程式 - 無論是 shell、使用者程式、系統程式或其他程式。終端機只是寫入 STDOUT 或 STDERR 的位元組流。

當您談論圖形控制台時,這個類比有些不成立,但在每個終端視窗中它都成立。這個終端機視窗只是等待 shell/程式向其發送字節,並以文字或其他 ASCII 字元的形式向使用者顯示這些位元組。

正如對此答案的評論中所指出的,當您深入系統時,這個類比會進一步崩潰。最初的短語“一切都是文件”和相關短語“一切都是字節流”似乎是為了簡化那些剛接觸系統或經驗有限的人的系統視圖而創建的。隨著您獲得經驗並更多地參與 Linux,您會意識到這種簡化有時是不正確的,但它對於剛剛熟悉環境的人仍然有價值。

相關內容