一文講解Linux proc文件系統(tǒng)介紹
最初開發(fā)/proc文件系統(tǒng)是為了提供有關(guān)系統(tǒng)中進(jìn)程的信息。但是由于這個文件系統(tǒng)非常有用,因此內(nèi)核中的很多元素也開始使用它來報告信息,或啟用動態(tài)運行時配置。 /proc文件系統(tǒng)包含了一些目錄(用作組織信息的方式)和虛擬文件。虛擬文件可以向用戶呈現(xiàn)內(nèi)核中的一些信息,也可以用作一種從用戶空間向內(nèi)核發(fā)送信息的手段。實際上我們并不會同時需要實現(xiàn)這兩點,但是本文將向您展示如何配置這個文件系統(tǒng)進(jìn)行輸入和輸出。 盡管像本文這樣短小的一篇文章無法詳細(xì)介紹/proc的所有用法,但是它依然對這兩種用法進(jìn)行了展示,從而可以讓我們體會一下/proc是多么強大。圖1是對/proc中部分元素進(jìn)行一次交互查詢的結(jié)果。它顯示的是/proc文件系統(tǒng)的根目錄中的內(nèi)容。注意,在左邊是一系列數(shù)字編號的文件。每個實際上都是一個目錄,表示系統(tǒng)中的一個進(jìn)程。由于在GNU/Linux中創(chuàng)建的第一個進(jìn)程是init進(jìn)程,因此它的process-id為1。然后對這個目錄執(zhí)行一個 ls命令,這會顯示很多文件。每個文件都提供了有關(guān)這個特殊進(jìn)程的詳細(xì)信息。例如,要查看init的command-line項的內(nèi)容,只需對cmdline文件執(zhí)行cat命令。

proc中另外一些有趣的文件有:cpuinfo,它標(biāo)識了處理器的類型和速度;pci:顯示在PCI總線上找到的設(shè)備;modules:標(biāo)識了當(dāng)前加載到內(nèi)核中的模塊。
圖2展示了對/proc中的一個虛擬文件進(jìn)行讀寫的過程。這個例子首先檢查內(nèi)核的TCP/IP棧中的IP轉(zhuǎn)發(fā)的目前設(shè)置,然后再啟用這種功能。

另外,我們還可以使用sysctl來配置這些內(nèi)核條目。
順便說一下,/proc文件系統(tǒng)并不是GNU/Linux系統(tǒng)中的惟一一個虛擬文件系統(tǒng)。在這種系統(tǒng)上,sysfs是一個與/proc類似的文件系統(tǒng),但是它的組織更好(從 /proc 中學(xué)習(xí)了很多教訓(xùn))。不過 /proc 已經(jīng)確立了自己的地位,因此即使sysfs與/proc相比有一些優(yōu)點,/proc也依然會存在。還有一個debugfs文件系統(tǒng),不過(顧名思義)它提供的更多是調(diào)試接口。debugfs的一個優(yōu)點是它將一個值導(dǎo)出給用戶空間非常簡單(實際上這不過是一個調(diào)用而已)。
【文章福利】小編推薦自己的Linux內(nèi)核技術(shù)交流群:【891587639】整理了一些個人覺得比較好的學(xué)習(xí)書籍、視頻資料共享在群文件里面,有需要的可以自行添加哦?。。。ê曨l教程、電子書、實戰(zhàn)項目及代碼)? ??


/proc目錄下常見的文件介紹:
/proc/apm 高級電源管理(APM)版本信息及電池相關(guān)狀態(tài)信息,通常由apm命令使用; proc/buddyinfo 用于診斷內(nèi)存碎片問題的相關(guān)信息文件; /proc/cmdline 在啟動內(nèi)核時傳遞至內(nèi)核的相關(guān)參數(shù)信息,這些信息通常由lilo或grub等啟動管理工具進(jìn)行傳遞;

/proc/cpuinfo 處理器的相關(guān)信息的文件; /proc/crypto 系統(tǒng)上已安裝的內(nèi)核使用的密碼算法及每個算法的詳細(xì)信息列表; /proc/devices 系統(tǒng)已經(jīng)加載的所有塊設(shè)備和字符設(shè)備的信息,包含主設(shè)備號和設(shè)備組(與主設(shè)備號對應(yīng)的設(shè)備類型)名; /proc/dma 每個正在使用且注冊的ISA DMA通道的信息列表; /proc/fb 幀緩沖設(shè)備列表文件,包含幀緩沖設(shè)備的設(shè)備號和相關(guān)驅(qū)動信息; /proc/filesystems 當(dāng)前被內(nèi)核支持的文件系統(tǒng)類型列表文件,被標(biāo)示為nodev的文件系統(tǒng)表示不需要塊設(shè)備的支持;通常mount一個設(shè)備時,如果沒有指定文件系統(tǒng)類型將通過此文件來決定其所需文件系統(tǒng)的類型; /proc/interrupts ARM體系架構(gòu)系統(tǒng)上每個IRQ相關(guān)的中斷號列表;

/proc/iomem 每個物理設(shè)備上的記憶體(RAM或者ROM)在系統(tǒng)內(nèi)存中的映射信息; /proc/kmsg 此文件用來保存由內(nèi)核輸出的信息,通常由/sbin/klogd或/bin/dmsg等程序使用,不要試圖使用查看命令打開此文件; /proc/meminfo 系統(tǒng)中關(guān)于當(dāng)前內(nèi)存的利用狀況等的信息,常由free命令使用;可以使用文件查看命令直接讀取此文件,其內(nèi)容顯示為兩列,前者為統(tǒng)計屬性,后者為對應(yīng)的值; /proc/modules 當(dāng)前裝入內(nèi)核的所有模塊名稱列表,可以由lsmod命令使用,也可以直接查看;如下所示,其中第一列表示模塊名,第二列表示此模塊占用內(nèi)存空間大小,第三列表示此模塊有多少實例被裝入,第四列表示此模塊依賴于其它哪些模塊,第五列表示此模塊的裝載狀態(tài)(Live:已經(jīng)裝入;Loading:正在裝入;Unloading:正在卸載),第六列表示此模塊在內(nèi)核內(nèi)存(kernel memory)中的偏移量; /proc/partitions 塊設(shè)備每個分區(qū)的主設(shè)備號(major)和次設(shè)備號(minor)等信息,同時包括每個分區(qū)所包含的塊(block)數(shù)目,如下圖所示;

/proc/slabinfo 在內(nèi)核中頻繁使用的對象(如inode、dentry等)都有自己的cache,即slab pool,而/proc/slabinfo文件列出了這些對象相關(guān)slap的信息;詳情可以參見內(nèi)核文檔中slapinfo的手冊頁; /proc/uptime 系統(tǒng)上次啟動以來的運行時間,如下所示,其第一個數(shù)字表示系統(tǒng)運行時間,第二個數(shù)字表示系統(tǒng)空閑時間,單位是秒;

/proc/version 當(dāng)前系統(tǒng)運行的內(nèi)核版本號,如下所示;

/proc/zoneinfo 內(nèi)存區(qū)域(zone)的詳細(xì)信息列表,信息量較大;
如何在/proc目錄下創(chuàng)建目錄或文件:
要在/proc文件系統(tǒng)中創(chuàng)建一個虛擬文件,請使用proc_create()或proc_create_data()函數(shù)。這個函數(shù)可以接收一個文件名、一組權(quán)限和這個文件在/proc文件系統(tǒng)中出現(xiàn)的位置。這兩個函數(shù)的返回值是一個proc_dir_entry類型指針(或者為NULL,說明在發(fā)生了錯誤時)。然后就可以使用這個返回的指針來配置這個虛擬文件的其他參數(shù),例如在對該文件執(zhí)行讀操作時應(yīng)該調(diào)用的函數(shù)。函數(shù)的原型和proc_dir_entry結(jié)構(gòu)中的一部分如下圖所示。
創(chuàng)建目錄的函數(shù)原型如下:
前者不可以傳入私有數(shù)據(jù),后者可以。關(guān)于私有數(shù)據(jù)的操作,我們后面會使用一個例子來說明。
要從/proc中刪除一個文件,可以使用remove_proc_entry()函數(shù)。要使用這個函數(shù),我們需要提供文件名字符串,以及這個文件在/proc文件系統(tǒng)中的位置(parent)。函數(shù)原型如下:
當(dāng)在/proc文件系統(tǒng)下創(chuàng)建文件之后用戶是怎么訪問這個文件的,其實看到proc_create()函數(shù)的最后一個參數(shù),傳入的是一個file_operations結(jié)構(gòu)體指針,其實,就是通過里面的read和write回調(diào)函數(shù)來實現(xiàn)的。下面我們來看一個具體的例子。
在/proc目錄下創(chuàng)建hello_proc文件,并往里面寫入數(shù)據(jù)或獲取里面的數(shù)據(jù)。
將此文件上傳到服務(wù)器并編譯模塊,然后將此模塊上傳到開發(fā)板上面。試驗過程如下:
生成的節(jié)點如下:

cat /proc/hello_proc的輸出信息如下:

echo hello > /proc/hello_proc的輸出信息如下:

再次cat /proc/hello_proc的輸出信息如下:

在使用proc_create()函數(shù)創(chuàng)建文件時,第二個參數(shù)是關(guān)于權(quán)限的設(shè)置,我們這里使用默認(rèn)的0,也就是只有讀取權(quán)限,這里就不再詳細(xì)介紹,如果感興趣可以自己做實驗。
