Linux 中所有內(nèi)容都是以文件的形式保存和管理的,即一切皆文件,普通文件是文件,目錄(Windows 下稱為文件夾)是文件,硬件設(shè)備(鍵盤、監(jiān)視器、硬盤、打印機(jī))是文件,就連套接字(socket)、網(wǎng)絡(luò)通信等資源也都是文件。
Linux系統(tǒng)中,文件具體可分為以下幾種類型:
1) 普通文件
類似 mp4、pdf、html 這樣,可直接拿來使用的文件都屬于普通文件,Linux 用戶根據(jù)訪問權(quán)限的不同可以對(duì)這些文件進(jìn)行查看、刪除以及更改操作。
2) 目錄文件
對(duì)于用慣 Windows 系統(tǒng)的用戶來說,目錄是文件可能不太好理解。
Linux 系統(tǒng)中,目錄文件包含了此目錄中各個(gè)文件的文件名以及指向這些文件的指針,打開目錄等同于打開目錄文件,只要你有權(quán)限,可以隨意訪問目錄中的任何文件。
注意,目錄文件的訪問權(quán)限,同普通文件的執(zhí)行權(quán)限,是一個(gè)意思。
3) 字符設(shè)備文件和塊設(shè)備文件
這些文件通常隱藏在 /dev/ 目錄下,當(dāng)進(jìn)行設(shè)備讀取或外設(shè)交互時(shí)才會(huì)被使用。
例如,磁盤光驅(qū)屬于塊設(shè)備文件,串口設(shè)備則屬于字符設(shè)備文件。
Linux 系統(tǒng)中的所有設(shè)備,要么是塊設(shè)備文件,要么是字符設(shè)備文件。
4) 套接字文件(socket)
套接字文件一般隱藏在 /var/run/ 目錄下,用于進(jìn)程間的網(wǎng)絡(luò)通信。
5) 符號(hào)鏈接文件(symbolic link)
類似與 Windows 中的快捷方式,是指向另一文件的簡介指針(也就是軟鏈接)。
6) 管道文件(pipe)
主要用于進(jìn)程間通信。例如,使用 mkfifo 命令創(chuàng)建一個(gè) FIFO 文件,與此同時(shí),啟用進(jìn)程 A 從 FIFO文件讀數(shù)據(jù),啟用進(jìn)程 B 從 FIFO文件中寫數(shù)據(jù),隨寫隨讀。
“一切皆文件”的利弊
和 Windows 系統(tǒng)不同,Linux 系統(tǒng)沒有 C 盤、D 盤、E 盤那么多的盤符,只有一個(gè)根目錄(/),所有的文件(資源)都存儲(chǔ)在以根目錄(/)為樹根的樹形目錄結(jié)構(gòu)中。
這樣做最明顯的好處是,開發(fā)者僅需要使用一套 API 和開發(fā)工具即可調(diào)取 Linux 系統(tǒng)中絕大部分的資源。舉個(gè)簡單的例子,Linux 中幾乎所有讀(讀文件,讀系統(tǒng)狀態(tài),讀 socket,讀 PIPE)的操作都可以用 read 函數(shù)來進(jìn)行;幾乎所有更改(更改文件,更改系統(tǒng)參數(shù),寫 socket,寫 PIPE)的操作都可以用 write 函數(shù)來進(jìn)行。
不利之處在于,使用任何硬件設(shè)備都必須與根目錄下某一目錄執(zhí)行掛載操作,否則無法使用。我們知道,本身 Linux 具有一個(gè)以根目錄為樹根的文件目錄結(jié)構(gòu),每個(gè)設(shè)備也同樣如此,它們是相互獨(dú)立的。如果我們想通過 Linux 上的根目錄找到設(shè)備文件的目錄結(jié)構(gòu),就必須將這兩個(gè)文件系統(tǒng)目錄合二為一,這就是掛載的真正含義。