爲什麼 Linux “一切皆文件”
概述
在 Linux 中,包括硬件設備、目錄、文本文件、二進制文件、輸入輸出流、套接字、管道、TTY 終端等各種資源都被抽象成文件,並且它們之間沒有太大的區別。每個文件都有一個唯一的路徑進行標識,因此可以通過文件系統中的路徑來訪問和管理這些資源。
一切皆爲文件的理念提供了最高級的抽象,開發者只需要使用一套 API 就可以操作 Linux 系統中的絕大部分資源。
一個典型的 Linux 系統的文件結構如下所示:
圖片來源: https://tldp.org/LDP/intro-linux/html/sect_03_01.html
常見文件類型
1. 普通文件
普通文件並不單單指文本文件,還包括可執行二進制程序、程序的輸入輸出等。
2. 目錄文件
目錄文件包含一組文件的所有者、權限和大小等信息。
3. 設備文件
所有物理設備都是通過設備文件進行訪問的,設備文件保存有關特定設備的位置、類型和訪問模式等信息,主要分爲兩種類型: 塊設備文件和字符設備文件。
塊設備文件 用於訪問塊設備 I/O, 塊設備使用的是緩衝 I/O,這意味着數據收集在緩衝區中,直到可以傳輸整個塊爲止。
字符設備文件 與字符或原始設備進行無緩衝數據傳輸,數據傳輸按照字符逐個進行,單次可以傳輸多個字符。
此外,某些設備(例如磁盤分區)可以以塊設備或字符設備模式訪問,每個設備文件對應一種訪問模式,因此這種具有多種訪問模式的物理設備將具有多個設備文件。
設備文件全部位於 dev
目錄,執行下面的命令:
$ ls -l /dev
輸出結果中會逐行輸出單個設備文件,第一個字符 b 表示該設備爲塊設備。
4. 特殊文件
特殊文件用於輸入和輸出的機制,本質上也是一種 “設備文件”,典型的特殊文件如:
-
/dev/null : 用於丟棄進程的輸出流
-
/dev/full : 對該文件進行寫入時始終返回相同的錯誤代碼:ENOSPC (表示設備上沒有可用空間)
-
/dev/zero : 用於一些需要初始化變量、清空內存或寫入特定位模式的應用程序
-
/dev/random : 利用物理過程(例如鍵盤敲擊、鼠標移動、磁盤 I/O 等)的噪聲來收集隨機性,並將其整合以產生高質量的隨機數。由於這些物理過程本身具有隨機性,因此可以確保生成的隨機數是真正的隨機數,而不是僞隨機數
# 查看設備文件
$ ls -l /dev/ | grep -e "null\|zero"
crw-rw-rw- 1 root root 1, 3 Jun 21 20:39 null
crw-rw-rw- 1 root root 1, 5 Jun 21 20:39 zero
# /dev/null 示例
$ echo "Hello World" > /dev/null
# /dev/full 示例
$ echo: write error: no space left on device
# /dev/zero 示例
# 將 /dev/zero 的輸出寫入到 text.txt 文件中,並且限制文件的大小爲 10MB。
# 由於從 /dev/zero 中讀取的所有數據都是零值,因此最終 test.txt 文件中將包含 10MB 的零值字節
$ dd if=/dev/zero of=test.txt bs=1M count=10
# /dev/random 示例
# 從 /dev/random 中讀取 16 個字節的隨機數據,並轉換爲一個無符號整數 (十進制表示形式)
# -t u4 參數指定以無符號 4 字節整數形式輸出數據
# -An 參數指定不要輸出地址信息
$ head -c 16 /dev/random | od -t u4 -An
5. 鏈接文件
使用 ln
命令創建硬鏈接和軟鏈接。
# 創建硬鏈接
$ ln /tmp/abc.txt /tmp/def.txt
# 創建軟鏈接
$ ln -s /tmp/abc.txt /tmp/def.txt
5. 套接字文件
套接字文件是一種特殊類型的文件,用於實現進程間通信 (IPC), 可以看作是網絡套接字與本地套接字的混合體。
對於進程間通信,套接字提供了一種簡單而強大的方式來傳遞數據,它們可以在同一臺計算機上的進程之間進行通信,也可以在不同計算機上的進程之間進行通信。套接字文件通常存儲在文件系統的特定目錄中,例如 /var/run 或 /tmp,通常分爲由操作系統系統軟件創建的和由應用程序創建的。
6. 命名管道文件
命名管道允許多個進程之間通過一個共享的命名管道文件進行通信,進程可以向管道寫入數據,並從管道讀取數據,就好像在普通文件中讀寫數據一樣。
查看文件類型
調用 ls
命令時,輸出結果中會逐行輸出單個文件,第一個字符 表示該文件的類型。
# 例如,我們可以查看 /var/run 目錄下的文件列表
$ ls -l /var/run
total 60
drwxr-xr-x 2 dnsmasq nogroup 4096 Jun 20 21:51 dnsmasq
drwx------ 6 root root 4096 Jun 24 08:09 docker
-rw-r--r-- 1 root root 3 Jun 24 08:09 docker.pid
srw-rw---- 1 root docker 0 Jun 24 08:09 docker.sock
-rw-r--r-- 1 root root 4 Jun 24 08:09 docker-ssd.pid
drwxr-xr-x 3 root root 4096 Jun 20 22:34 google
drwxrwxrwt 2 root root 4096 Jan 1 1970 lock
drwxr-xr-x 2 root root 4096 Jun 24 08:09 metrics
drwxr-xr-x 2 root root 4096 Jan 1 1970 mount
drwxrwsr-x 2 postgres postgres 4096 Jun 20 21:54 postgresql
-rw-r--r-- 1 root root 1 Jun 24 08:09 rsyslogd.pid
drwxr-xr-x 3 root root 4096 Jun 20 21:52 runit
drwxr-xr-x 2 root root 4096 Jun 20 21:55 sshd
-rw-r--r-- 1 root root 4 Jun 24 08:09 sshd.pid
-rw-r--r-- 1 root root 3 Jun 24 08:09 supervisor.pid
-rw-rw-r-- 1 root utmp 768 Jun 24 08:09 utmp
-rw------- 1 root root 0 Jun 24 08:09 xtables.lock
常見文件操作
開發者可以直接調用 API 對文件進行操作,而無需關心文件的具體類型,這種 “多態性” 是直接建立在操作系統上面的。
小結
Linux 中 一切皆爲文件 的設計理念帶來了許多好處:
-
統一接口: 使用相同的 API 可以對所有類型的文件進行操作,例如讀取、寫入、移動、刪除、修改權限等
-
簡化管理: 使用相同的工具和方式來管理文件和設備的操作,例如備份、複製、移動、刪除、鏈接等
-
編程性 : 一個程序可以通過文件與其他程序通信,使得程序之間的交互、測試、集成等行爲變得更容易,並且可以針對不同的應用場景,使用適用的編程語言來編寫代碼,提升靈活性和開發效率
-
擴展性 : 可以創建自定義的文件系統以支持特定的文件或設備類型,最終將新的硬件或軟件集成到已有系統中
Reference
-
Everything is a File[1]
-
General overview of the Linux file system[2]
-
Everything Is File In Linux[3]
-
Everything Is File In Linux[4]
-
Explanation of “Everything is a File” and Types of Files in Linux[5]
鏈接
[1] Everything is a File: http://ibgwww.colorado.edu/~lessem/psyc5112/usail/concepts/filesystems/everything-is-a-file.html
[2] General overview of the Linux file system: https://tldp.org/LDP/intro-linux/html/sect_03_01.html
[3] Everything Is File In Linux: https://www.linuxandubuntu.com/home/everything-is-file-in-linux-part-1
[4] Everything Is File In Linux: https://www.linuxandubuntu.com/home/everything-is-file-in-linux-part-2
[5] Explanation of “Everything is a File” and Types of Files in Linux: https://www.tecmint.com/everything-is-file-and-types-of-files-linux/
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/j3hwHXVH8ONd955gSURHFg