1. 程式人生 > >Android下的兩個檔案系統:proc和sys(一)

Android下的兩個檔案系統:proc和sys(一)

Linux層有公共目錄。例如ps命令可以看到所有執行的程序資訊(程序的UID,PID,記憶體,CPU等資訊)。大多數資源由兩個虛擬的檔案系統提供:
proc filesystem(procfs) :包括記憶體,CPU,網路等
sys filesystem(sysfs):裝置驅動,網路環境(/sys/class/net/)等


【引號內容為轉載】
”proc檔案系統是一個偽檔案系統,它只存在記憶體當中,而不佔用外存空間。它以檔案系統的方式為訪問系統核心資料的操作提供介面。使用者和應用程式可以通過proc得到系統的資訊,並可以改變核心的某些引數。"
“/proc 檔案系統是一種核心和核心模組用來向程序 (process) 傳送資訊的機制 (所以叫做 /proc)。這個偽檔案系統讓你可以和核心內部資料結構進行互動,獲取 有關程序的有用資訊,在執行中 (on the fly) 改變設定 (通過改變核心引數)。 與其他檔案系統不同,/proc 存在於記憶體之中而不是硬碟上。如果你察看檔案 /proc/mounts (和 mount 命令一樣列出所有已經載入的檔案系統),你會看到其中 一行是這樣的: 
grep proc /proc/mounts
/proc /proc proc rw 0 0
/proc 由核心控制,沒有承載 /proc 的裝置。因為 /proc 主要存放由核心控制的狀態資訊,所以大部分這些資訊的邏輯位置位於核心控制的記憶體。對 /proc 進行一次 'ls -l' 可以看到大部分檔案都是 0 位元組大的;不過察看這些檔案的時候,確實可以看到一些資訊。這怎麼可能?這是因為 /proc 檔案系統和其他常規的檔案系統一樣把自己註冊到虛擬檔案系統層 (VFS) 了。然而,直到當 VFS 呼叫它,請求檔案、目錄的 i-node 的時候,/proc 檔案系統才根據核心中的資訊建立相應的檔案和目錄。” 




1. proc/uid_stat/
手機資料使用情況統計在
/proc/uid_stat/(每個app)
/sys/class/net/[interface]/statistics/(每個interface)
第一個資料可以直接訪問,或通過TrafficStatsAPI訪問。
其中/proc/uid_stat/[uid]/tcp_rcv和 /proc/uid_stat/[uid]/tcp_snd記錄了每個app收發的位元組數,


2.proc/meminfo
記憶體使用率


3.proc/stat
處理器使用率


具體的內容可以參考linux手冊中的文件 
/usr/src/linux/Documentation/filesystems/proc.txt
在proc目錄下,有很多數字編號的檔案。每個數字代表一個程序的PID。Android中,每個應用是用唯一的UID標識的,我們在/proc/[pid]/status檔案中可以知道該程序對應的UID(即應用)。
這裡的UID有四行:分別是
第一列數字(RUID):實際使用者ID,指的是程序執行者是誰.
第二列數字(EUID):有效使用者ID,指程序執行時對檔案的訪問許可權.
第三列數字(SUID):儲存設定使用者ID,作為effective user ID的副本,在執行exec呼叫時後能重新恢復原來的effectiv user ID.
第四列數字(FSUID):目前程序的檔案系統的使用者識別碼.一般情況下,檔案系統的使用者識別碼(fsuid)與有效的使用者識別碼(euid)是相同的.
一般這四行是一樣的,看第一行就好。
以下具體內容可見:http://linux.die.net/man/5/proc
每個程序的目錄下有如下一些檔案:
auxv:ELF資訊,不過試著用cat打出來是亂碼
cgroup: control group的資訊,即屬於哪個組,這裡也可以看屬於哪個UID
cwd:程序當前的工作目錄
exe:指向可執行的程式
fd:程序開啟的檔案,裡面的每個檔案由檔案描述符來命名。0是標準輸入,1是標準輸出等等。。
maps:所有對映的記憶體區域和訪問許可權
mem:通過open,read,lseek等訪問程序的記憶體
mounts和mountstat, mountinfo: mount資訊
ns: 可以通過setns命令設定的namespace以及有關的內容。
oom_adj:記憶體不足(out of memmory時,用於殺死程序的命令)
root:指向程序根目錄的符號連結
smaps:記憶體使用情況
stat:ps命令用,
statm:記憶體資訊