天天看點

诠釋 Linux 中“一切都是檔案”概念和相應的檔案類型

linux 系統中一切都是檔案并有相應的檔案類型

在 unix 和它衍生的比如 linux 系統中,一切都可以看做檔案。雖然它僅僅隻是一個泛泛的概念,但這是事實。如果有不是檔案的,那它一定是正運作的程序。

要了解這點,可以舉個例子,您的根目錄(/)的空間充斥着不同類型的 linux 檔案。當您建立一個檔案或向系統傳輸一個檔案時,它會在實體磁盤上占據的一些空間,而且是一個特定的格式(檔案類型)。

雖然 linux 系統中檔案和目錄沒有什麼不同,但目錄還有一個重要的功能,那就是有結構性的分組存儲其它檔案,以友善查找通路。所有的硬體元件都表示為檔案,系統使用這些檔案來與硬體通信。

這些思想是對 linux 中的各種事物的重要闡述,是以像文檔、目錄(mac os x 和 windows 系統下稱之為檔案夾)、鍵盤、螢幕、硬碟、可移動媒體裝置、列印機、數據機、虛拟終端,還有程序間通信(ipc)和網絡通信等輸入/輸出資源都是定義在檔案系統空間下的位元組流。

一切都可看作是檔案,其最顯著的好處是對于上面所列出的輸入/輸出資源,隻需要相同的一套 linux 工具、實用程式和 api。

<a target="_blank"></a>

linux 系統中有三種基本的檔案類型:

普通/正常檔案

特殊檔案

目錄檔案

它們是包含文本、資料、程式指令等資料的檔案,其在 linux 系統中是最常見的一種。包括如下:

可讀檔案

二進制檔案

圖像檔案

壓縮檔案等等

特殊檔案包括以下幾種:

塊檔案block:裝置檔案,對通路系統硬體部件提供了緩存接口。它們提供了一種通過檔案系統與裝置驅動通信的方法。

有關于塊檔案一個重要的性能就是它們能在指定時間内傳輸大塊的資料和資訊。

列出某目錄下的塊檔案:

<code># ls -l /dev | grep "^b"</code>

輸出例子

<code>brw-rw---- 1 root disk 7, 0 may 18 10:26 loop0</code>

<code>brw-rw---- 1 root disk 7, 1 may 18 10:26 loop1</code>

<code>brw-rw---- 1 root disk 7, 2 may 18 10:26 loop2</code>

<code>brw-rw---- 1 root disk 7, 3 may 18 10:26 loop3</code>

<code>brw-rw---- 1 root disk 7, 4 may 18 10:26 loop4</code>

<code>brw-rw---- 1 root disk 7, 5 may 18 10:26 loop5</code>

<code>brw-rw---- 1 root disk 7, 6 may 18 10:26 loop6</code>

<code>brw-rw---- 1 root disk 7, 7 may 18 10:26 loop7</code>

<code>brw-rw---- 1 root disk 1, 0 may 18 10:26 ram0</code>

<code>brw-rw---- 1 root disk 1, 1 may 18 10:26 ram1</code>

<code>brw-rw---- 1 root disk 1, 10 may 18 10:26 ram10</code>

<code>brw-rw---- 1 root disk 1, 11 may 18 10:26 ram11</code>

<code>brw-rw---- 1 root disk 1, 12 may 18 10:26 ram12</code>

<code>brw-rw---- 1 root disk 1, 13 may 18 10:26 ram13</code>

<code>brw-rw---- 1 root disk 1, 14 may 18 10:26 ram14</code>

<code>brw-rw---- 1 root disk 1, 15 may 18 10:26 ram15</code>

<code>brw-rw---- 1 root disk 1, 2 may 18 10:26 ram2</code>

<code>brw-rw---- 1 root disk 1, 3 may 18 10:26 ram3</code>

<code>brw-rw---- 1 root disk 1, 4 may 18 10:26 ram4</code>

<code>brw-rw---- 1 root disk 1, 5 may 18 10:26 ram5</code>

<code>...</code>

字元檔案character: 也是裝置檔案,對通路系統硬體元件提供了非緩沖串行接口。它們與裝置的通信工作方式是一次隻傳輸一個字元的資料。

列出某目錄下的字元檔案:

<code># ls -l /dev | grep "^c"</code>

<code>crw------- 1 root root 10, 235 may 18 15:54 autofs</code>

<code>crw------- 1 root root 10, 234 may 18 15:54 btrfs-control</code>

<code>crw------- 1 root root 5, 1 may 18 10:26 console</code>

<code>crw------- 1 root root 10, 60 may 18 10:26 cpu_dma_latency</code>

<code>crw------- 1 root root 10, 203 may 18 15:54 cuse</code>

<code>crw------- 1 root root 10, 61 may 18 10:26 ecryptfs</code>

<code>crw-rw---- 1 root video 29, 0 may 18 10:26 fb0</code>

<code>crw-rw-rw- 1 root root 1, 7 may 18 10:26 full</code>

<code>crw-rw-rw- 1 root root 10, 229 may 18 10:26 fuse</code>

<code>crw------- 1 root root 251, 0 may 18 10:27 hidraw0</code>

<code>crw------- 1 root root 10, 228 may 18 10:26 hpet</code>

<code>crw-r--r-- 1 root root 1, 11 may 18 10:26 kmsg</code>

<code>crw-rw----+ 1 root root 10, 232 may 18 10:26 kvm</code>

<code>crw------- 1 root root 10, 237 may 18 10:26 loop-control</code>

<code>crw------- 1 root root 10, 227 may 18 10:26 mcelog</code>

<code>crw------- 1 root root 249, 0 may 18 10:27 media0</code>

<code>crw------- 1 root root 250, 0 may 18 10:26 mei0</code>

<code>crw-r----- 1 root kmem 1, 1 may 18 10:26 mem</code>

<code>crw------- 1 root root 10, 57 may 18 10:26 memory_bandwidth</code>

<code>crw------- 1 root root 10, 59 may 18 10:26 network_latency</code>

<code>crw------- 1 root root 10, 58 may 18 10:26 network_throughput</code>

<code>crw-rw-rw- 1 root root 1, 3 may 18 10:26 null</code>

<code>crw-r----- 1 root kmem 1, 4 may 18 10:26 port</code>

<code>crw------- 1 root root 108, 0 may 18 10:26 ppp</code>

<code>crw------- 1 root root 10, 1 may 18 10:26 psaux</code>

<code>crw-rw-rw- 1 root tty 5, 2 may 18 17:40 ptmx</code>

<code>crw-rw-rw- 1 root root 1, 8 may 18 10:26 random</code>

符号連結檔案symbolic link : 符号連結是指向系統上其他檔案的引用。是以,符号連結檔案是指向其它檔案的檔案,那些檔案可以是目錄或正常檔案。

列出某目錄下的符号連結檔案:

<code># ls -l /dev/ | grep "^l"</code>

<code>lrwxrwxrwx 1 root root 3 may 18 10:26 cdrom -&gt; sr0</code>

<code>lrwxrwxrwx 1 root root 11 may 18 15:54 core -&gt; /proc/kcore</code>

<code>lrwxrwxrwx 1 root root 13 may 18 15:54 fd -&gt; /proc/self/fd</code>

<code>lrwxrwxrwx 1 root root 4 may 18 10:26 rtc -&gt; rtc0</code>

<code>lrwxrwxrwx 1 root root 8 may 18 10:26 shm -&gt; /run/shm</code>

<code>lrwxrwxrwx 1 root root 15 may 18 15:54 stderr -&gt; /proc/self/fd/2</code>

<code>lrwxrwxrwx 1 root root 15 may 18 15:54 stdin -&gt; /proc/self/fd/0</code>

<code>lrwxrwxrwx 1 root root 15 may 18 15:54 stdout -&gt; /proc/self/fd/1</code>

linux 中使用 <code>ln</code> 工具就可以建立一個符号連結檔案,如下所示:

<code># touch file1.txt</code>

<code># ln -s file1.txt /home/tecmint/file1.txt [建立符号連結檔案]</code>

<code># ls -l /home/tecmint/ | grep "^l" [列出符号連結檔案]</code>

在上面的例子中,首先我們在 <code>/tmp</code> 目錄建立了一個名叫 <code>file1.txt</code> 的檔案,然後建立符号連結檔案,将<code>/home/tecmint/file1.txt</code> 指向 <code>/tmp/file1.txt</code> 檔案。

管道pipe和指令管道named pipe : 将一個程序的輸出連接配接到另一個程序的輸入,進而允許程序間通信(ipc)的檔案。

命名管道實際上是一個檔案,用來使兩個程序彼此通信,就像一個 linux 管道一樣。

列出某目錄下的管道檔案:

<code># ls -l | grep "^p"</code>

輸出例子:

<code>prw-rw-r-- 1 tecmint tecmint 0 may 18 17:47 pipe1</code>

<code>prw-rw-r-- 1 tecmint tecmint 0 may 18 17:47 pipe2</code>

<code>prw-rw-r-- 1 tecmint tecmint 0 may 18 17:47 pipe3</code>

<code>prw-rw-r-- 1 tecmint tecmint 0 may 18 17:47 pipe4</code>

<code>prw-rw-r-- 1 tecmint tecmint 0 may 18 17:47 pipe5</code>

在 linux 中可以使用 <code>mkfifo</code> 工具來建立一個命名管道,如下所示:

<code># mkfifo pipe1</code>

<code># echo "this is named pipe1" &gt; pipe1</code>

然後,我們打開另外一個 shell 終端,運作另外的指令來列印出剛加入管道的資料。

<code># while read line ;do echo "this was passed-'$line' "; done&lt;pipe1</code>

套接字檔案socket : 提供程序間通信方法的檔案,它們能在運作在不同環境中的程序之間傳輸資料和資訊。

這就是說,套接字可以為運作網絡上不同機器中的程序提供資料和資訊傳輸。

一個 socket 運作的例子就是網頁浏覽器連接配接到網站伺服器的過程。

<code># ls -l /dev/ | grep "^s"</code>

<code>srw-rw-rw- 1 root root 0 may 18 10:26 log</code>

下面是使用 c 語言編寫的調用 <code>socket()</code> 系統調用的例子。

<code>int socket_desc= socket(af_inet, sock_stream, 0 );</code>

上例中:

<code>af_inet</code> 指的是位址域(ipv4)

<code>sock_stream</code> 指的是類型(預設使用 tcp 協定連接配接)

<code>0</code> 指協定(ip 協定)

使用 <code>socket_desc</code> 來引用管道檔案,它跟檔案描述符是一樣的,然後再使用系統函數 <code>read()</code> 和<code>write()</code> 來分别從這個管道檔案讀寫資料。

這是一些特殊的檔案,既可以包含普通檔案又可包含其它的特殊檔案,它們在 linux 檔案系統中是以根(/)目錄為起點分層組織存在的。

列出某目錄下的目錄檔案:

<code># ls -l / | grep "^d"</code>

<code>drwxr-xr-x 2 root root 4096 may 5 15:49 bin</code>

<code>drwxr-xr-x 4 root root 4096 may 5 15:58 boot</code>

<code>drwxr-xr-x 2 root root 4096 apr 11 2015 cdrom</code>

<code>drwxr-xr-x 17 root root 4400 may 18 10:27 dev</code>

<code>drwxr-xr-x 168 root root 12288 may 18 10:28 etc</code>

<code>drwxr-xr-x 3 root root 4096 apr 11 2015 home</code>

<code>drwxr-xr-x 25 root root 4096 may 5 15:44 lib</code>

<code>drwxr-xr-x 2 root root 4096 may 5 15:44 lib64</code>

<code>drwx------ 2 root root 16384 apr 11 2015 lost+found</code>

<code>drwxr-xr-x 3 root root 4096 apr 10 2015 media</code>

<code>drwxr-xr-x 3 root root 4096 feb 23 17:54 mnt</code>

<code>drwxr-xr-x 16 root root 4096 apr 30 16:01 opt</code>

<code>dr-xr-xr-x 223 root root 0 may 18 15:54 proc</code>

<code>drwx------ 19 root root 4096 apr 9 11:12 root</code>

<code>drwxr-xr-x 27 root root 920 may 18 10:54 run</code>

<code>drwxr-xr-x 2 root root 12288 may 5 15:57 sbin</code>

<code>drwxr-xr-x 2 root root 4096 dec 1 2014 srv</code>

<code>dr-xr-xr-x 13 root root 0 may 18 15:54 sys</code>

<code>drwxrwxrwt 13 root root 4096 may 18 17:55 tmp</code>

<code>drwxr-xr-x 11 root root 4096 mar 31 16:00 usr</code>

<code>drwxr-xr-x 12 root root 4096 nov 12 2015 var</code>

您可以使用 mkdir 指令來建立一個目錄。

<code># mkdir -m 1666 tecmint.com</code>

<code># mkdir -m 1666 news.tecmint.com</code>

<code># mkdir -m 1775 linuxsay.com</code>

現在應該對為什麼 linux 系統中一切都是檔案以及 linux 系統中可以存在哪些類型的檔案有一個清楚的認識了。

原文釋出時間為:2016-08-10

本文來自雲栖社群合作夥伴“linux中國”

繼續閱讀