本文將通過一個簡單易懂的例子說明如何使用Linux下的PROC檔案系統來獲得程式的資訊。通過PROC檔案系統獲取的資訊主要是程式使用的虛擬記憶體、以及實際記憶體、訊號機制方面的資訊,和Linux下的其他監控工具搭配,能夠對系統執行的情況有一個全面的掌握。首先提供一段PROC檔案系統的簡單介紹:

PROC檔案系統是一個虛擬的檔案系統,通過檔案系統的介面實現,用於輸出系統的執行狀態。它以檔案系統的形式,為作業系統本身和應用程式之間的通訊提供了一個介面,使應用程式能夠安全、方便地獲得系統當前的執行狀況和核心的內部資料資訊,並可以修改某些系統的配置資訊。另外,由於PROC以檔案系統的介面實現,因此使用者可以像訪問普通檔案一樣對其進行訪問,但它只存在於記憶體之中,並不存在於真正的物理磁碟當中。所以,當系統重啟和電源關閉的時候,該系統中的資料和資訊將全部消失。

表1說明了該檔案系統中一些重要的檔案和目錄。

表1 重要的PROC檔案系統檔案和目錄

檔案或目錄 說    明
/proc/1 關於程式1的資訊目錄。每個程式在/proc下有一個名為其程式號的目錄
/proc/cpuinfo 處理器資訊,如型別、製造商、型號和效能
/proc/devices 當前執行的核心配置的裝置驅動的列表
/proc/dma 顯示當前使用的DMA通道
/proc/filesystems 核心配置的檔案系統
/proc/interrupts 顯示使用的中斷
/proc/ioports 當前使用的I/O埠
/proc/kcore 系統實體記憶體映像
/proc/kmsg 核心輸出的訊息,也被送到syslog
/proc/ksyms 核心符號表
/proc/loadavg 系統的平均負載
/proc/meminfo 儲存器使用資訊,包括實體記憶體和swap
/proc/modules 當前載入了哪些核心模組
/proc/net 網路協議狀態資訊
/proc/stat 系統的不同狀態
/proc/version 核心版本
/proc/uptime 系統啟動的時間長度

值得注意的是:所有上述檔案給出易讀的文字檔案,有時可能是不易讀的格式。有許多命令做了些格式化以更容易讀。例如,free程式讀/proc/meminfo並將給出的位元組數轉換為千位元組(並增加了一些資訊)。


下面將通過例子來說明如何使用PROC檔案系統來獲得程式的資訊。

首先使用vi編輯器建立一個c源程式檔案,編譯後形成目標檔案,該檔案的主要功能是進行計算,將其儲存在/root目錄下,下面將其執行:

#cd /root                       //切換目錄
#./calculate                    //執行該程式,則生成了以該程式為名稱的程式

使用ps命令,則能發現在系統中執行了calculate這樣一個程式:

#ps
root      2108 61.2 0.1 1344 224 pts/0    R    21:20   0:11 ./calculate
……

程式的基本資訊都會存放在/proc檔案系統中,具體位置是在/proc目錄下。通過使用如下命令可以檢視系統中執行程式的相關資訊:

# ls /proc                      //檢視/proc目錄下的內容
//如下顯示為系統中執行程式的資訊所存放的目錄,每個程式對應一個目錄,加藍的2108為本例使用的程式的詳細資訊所在目錄
1     1790 1922 2049 2083 8            fs          meminfo     swaps
10    1799 1923 2056 2108 9            ide         misc        sys
11    1809 1924 2063 2111 apm          interrupts modules     sysvipc
1491 1818 1925 2065 2138 bus          iomem       mounts      tty
1550 1829 1968 2067 2162 cmdline      ioports     mtrr        uptime
1554 1893 1969 2069 2163 cpuinfo      irq         net         version
1572 19    1978 2071 3     devices      kcore       partitions
1591 1902 2     2073 4     dma          kmsg        pci
1670 1911 2032 2074 5     driver       ksyms       scsi
1720 1919 2043 2079 6     execdomains loadavg     self
1757 1920 2045 2081 7     fb           locks       slabinfo
1771 1921 2047 2082 77    filesystems mdstat      stat
#cd 2108                        //切換到2108目錄,以方便詳細的檢視程式資訊
#ls                             //列出程式詳細的狀態資訊檔案
cmdline cwd environ exe fd maps mem mounts root stat statm status

在這些檔案當中,status這個狀態檔案是比較重要的,包含了很多關於程式的有用的資訊,使用者可以從這個檔案獲得資訊,如下為列出該檔案內容的操作:

#cat status                     //使用cat命令列出status檔案內容
Name:   calculate               //程式名
State: R (running)             //程式執行狀態
Tgid:   2108                    //程式組ID
Pid:    2108                     //程式ID
PPid:   2083                    //父程式ID
TracerPid:      0                //跟蹤除錯程式ID
Uid:    0       0       0       0   //程式所對應程式的UID
Gid:    0       0       0       0   //程式所對應程式的GID
FDSize: 256                     //程式使用檔案控制程式碼大小
Groups: 0 1 2 3 4 10 10         //組資訊
//程式所使用的虛擬記憶體以及實際記憶體、訊號機制方面的資訊
VmSize:     1344 kB
VmLck:         0 kB
VmRSS:       224 kB
VmData:       12 kB
VmStk:        16 kB
VmExe:         4 kB
VmLib:      1292 kB
SigPnd: 0000000000000000
SigBlk: 0000000000000000
SigIgn: 8000000000000000
SigCgt: 0000000000000000
CapInh: 0000000000000000
CapPrm: 00000000fffffeff
CapEff: 00000000fffffeff

這樣,我們就可以知道程式使用的虛擬記憶體、以及實際記憶體、訊號機制方面的資訊了。