了解 /dev 及其子目錄和文件
$ ls -l /dev/stdin /dev/fd/0 lrwx------ 1 tim tim 64 2011-08-07 09:53 /dev/fd/0 -> /dev/pts/2 lrwxrwxrwx 1 root root 15 2011-08-06 08:14 /dev/stdin -> /proc/self/fd/0 $ ls -l /dev/pts/2 /proc/self/fd/0 crw--w---- 1 tim tty 136, 2 2011-08-07 09:54 /dev/pts/2 lrwx------ 1 tim tim 64 2011-08-07 09:54 /proc/self/fd/0 -> /dev/pts/2
- 我想知道是否所有文件
/dev
及其子目錄都是設備的文件描述符?- 為什麼彼此之間有這麼多連結?例如,
/dev/fd/0
、/dev/stdin
、/proc/self/fd/0
都是指向 的連結/dev/pts/2
。- 如果
l
在lrwx------
平均連結中,c
在crw--w----
意味著什麼?
幾乎所有的文件
/dev
都是設備文件。讀取和寫入正常文件將數據儲存在磁碟或其他文件系統上,而訪問設備文件則與核心中的驅動程序進行通信,核心中的驅動程序通常又與硬體(硬體設備,因此得名)進行通信。有兩種類型的設備文件:塊設備(由
b
的輸出中的第一個字元ls -l
表示)和字元設備(由 表示c
)。塊設備和字元設備之間的區別並不完全通用。塊設備類似於磁碟,其行為類似於大型、固定大小的文件:如果您在某個偏移量處寫入一個字節,然後在該偏移量處從設備中讀取,您將獲得該字節。字元設備幾乎是其他任何東西,寫入一個字節會立即產生效果(例如,它在串列線路上發出),而讀取一個字節也有一些立即效果(例如,它是從串列埠讀取的)。設備文件的含義取決於其編號,而不是名稱(名稱對應用程序很重要,但對核心無關)。該數字實際上是兩個數字:主要數字表示哪個驅動程序負責該設備,次要數字允許驅動程序驅動多個設備¹。這些數字出現在
ls -l
列表中,您通常可以在其中找到文件大小。例如brw-rw---- 1 root disk 8, 0 Jul 12 15:54 /dev/sda
→這個設備是major 8,minor 0。下面的一些設備文件
/dev
與硬體設備不對應。每個 Unix 系統上都存在的一個是/dev/null
; 寫入它沒有效果,並且從它讀取永遠不會返回任何數據。當您想忽略命令的輸出 (>/dev/null
) 或執行沒有輸入的命令 ( ) 時,這在 shell 腳本中通常很方便</dev/null
。其他常見的例子是/dev/zero
(它返回空字節ad infinitum)/dev/urandom
(它返回隨機字節ad infinitum)。一些設備文件的含義取決於訪問它的程序。例如,
/dev/stdin
指定目前程序的標準輸入;opens from 與打開作為程序標準輸入打開的原始文件的效果大致相同。有點類似,/dev/tty
指定程序連接到的終端。在 Linux 下,現在/dev/stdin
和朋友不是作為字元設備實現的,而是作為符號連結到一個更通用的機制,允許引用每個文件描述符(而不是傳統方法下只有 0、1 和 2);例如/dev/stdin
是一個符號連結到/proc/self/fd/0
. 請參閱/dev/fd 與 /proc/self/fd/ 有何關係?.您會在 下找到許多符號連結
/dev
。這可能由於歷史原因而發生:設備文件從一個名稱移動到另一個名稱,但某些應用程序仍使用舊名稱。比如是Linux下/dev/scd0
的符號連結;/dev/sr0
兩者都指定第一個 CD 設備。符號連結的另一個原因是組織:在 Linux 下,你會在幾個地方找到你的硬碟和分區:/dev/sda
和/dev/sda1
朋友(每個磁碟由任意字母指定,分區根據分區佈局),/dev/disk/by-id/*
(由唯一的序列號),/dev/disk/by-label/*
(具有文件系統的分區,由人工選擇的標籤指定);和更多。當通用設備名稱可能是幾個之一時,也使用符號連結;例如/dev/dvd
可能是指向 的符號連結/dev/sr0
,或者/dev/sr1
如果您有兩個 CD 閱讀器並且第二個是預設 DVD 閱讀器,則它可能是指向的連結。
/dev
最後,由於傳統原因,您可能會在 下找到一些其他文件。您不會在每個系統上都找到相同的。在大多數 unice 上,/dev/log
是程序用來發出日誌消息的套接字。/dev/MAKEDEV
是一個在 中創建條目的腳本/dev
。在現代 Linux 系統上,條目/dev/
由udev自動創建,已過時MAKEDEV
。¹ 這在 Linux 下實際上不再適用,但這個細節只對設備驅動程序編寫者很重要。