爲什麼 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. 特殊文件

特殊文件用於輸入和輸出的機制,本質上也是一種 “設備文件”,典型的特殊文件如:

# 查看設備文件
$ 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 命令時,輸出結果中會逐行輸出單個文件,第一個字符 表示該文件的類型。

okI4AQ

# 例如,我們可以查看 /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

常見文件操作

KBc5DY

開發者可以直接調用 API 對文件進行操作,而無需關心文件的具體類型,這種 “多態性” 是直接建立在操作系統上面的。

小結

Linux 中 一切皆爲文件 的設計理念帶來了許多好處:

Reference

鏈接

[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