1、/proc 文件系統(tǒng)
/proc 是一個(gè)虛擬文件系統(tǒng),包含了各種用于展示內(nèi)核信息的文件,并且允許進(jìn)程通過常規(guī)文件 IO 系統(tǒng)調(diào)用方便地讀取,有時(shí)還可以修改這些信息。
之所以稱 /proc ?為虛擬文件系統(tǒng),是因?yàn)槠浒奈募妥幽夸洸皇谴鎯?chǔ)于磁盤上的,而是由內(nèi)核在進(jìn)程訪問此類信息時(shí)動(dòng)態(tài)創(chuàng)建的。
1.1、獲取進(jìn)程的有關(guān)信息
每個(gè)進(jìn)程,內(nèi)核都會(huì)提供一個(gè)相應(yīng)的目錄 proc/PID,其中 PID 是進(jìn)程的 ID,此目錄的各種文件和子目錄包含了進(jìn)程的相關(guān)信息。
/proc/PID 目錄下的文件節(jié)選:
/proc/PID/fd:為進(jìn)程打開的每個(gè)文件描述符都包含一個(gè)符號鏈接,每個(gè)符號鏈接的名稱都與描述符的數(shù)值相匹配
/proc/PID/task :提供線程目錄,每個(gè)目錄中包含的子目錄 /proc/PID/task/TID,其中 TID 是線程 ID,即 gettid() 返回值。
1.2、/proc 目錄下的系統(tǒng)信息
/proc :各種系統(tǒng)信息
/proc/net :有關(guān)網(wǎng)絡(luò)和套接字的狀態(tài)信息
/proc/sys/fs :文件系統(tǒng)相關(guān)設(shè)置
/proc/sys/kernel :各種常規(guī)的內(nèi)核設(shè)置
/proc/sys/net :網(wǎng)絡(luò)和套接字的設(shè)置
/proc/sys/vm :內(nèi)存管理設(shè)置
/proc/sysvipc :有關(guān) System V IPC 對象的信息
1.3、訪問 /proc 文件
通常使用 shell 腳本來訪問 /proc 目錄下的文件:
?
echo 100000 > /proc/sys/kernel/pid_max cat /proc/sys/kernel/pid_max
?
也可以在程序中使用常規(guī) IO 系統(tǒng)調(diào)用來訪問 /proc 目錄下的文件:
/proc 目錄下的一些文件是只讀的,即這些文件僅用于顯示內(nèi)核信息,無法對其進(jìn)行修改, /proc/PID 目錄下的大多數(shù)文件就屬于此種類型
/proc 目錄下的一些文件僅能由文件擁有者或者特權(quán)級進(jìn)程讀取, /proc/PID 目錄下的所有文件都是如此
除了 ?/proc/PID 子目錄的文件, /proc 目錄的其他文件大多屬于 root ?用戶,并且也只能由 root 用戶來修改這些文件
1.4、訪問 ?/proc/PID 目錄中的文件
/proc/PID 目錄的內(nèi)容變化不定,每個(gè)目錄隨著相應(yīng)的進(jìn)程 ID 的創(chuàng)建而生,又隨著進(jìn)程的終止而消滅。
2、系統(tǒng)標(biāo)識
uname() 系統(tǒng)調(diào)用返回了一系列關(guān)于主機(jī)系統(tǒng)的標(biāo)識信息,存儲(chǔ)于 utsbuf 結(jié)構(gòu)體中:
?
#includeint uname(struct utsname *buf);
?
utsbuf :
?
struct utsname { ? ? ? ? ? ? ? char sysname[]; ? /* Operating system name (e.g., "Linux") */ ? ? ? ? ? ? ? char nodename[]; ? /* Name within "some implementation-defined ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? network" */ ? ? ? ? ? ? ? char release[]; ? /* Operating system release (e.g., "2.6.28") */ ? ? ? ? ? ? ? char version[]; ? /* Operating system version */ ? ? ? ? ? ? ? char machine[]; ? /* Hardware identifier */ ? ? ? ? ? #ifdef _GNU_SOURCE ? ? ? ? ? ? ? char domainname[]; /* NIS or YP domain name */ ? ? ? ? ? #endif ? ? ? ? ? };
?
在 Linux 中這些字段的長度都是 65,其中包括了空字節(jié)終止符所占用的空間
sysname,release,version,machine 字段由內(nèi)核自動(dòng)設(shè)置
/proc/version 中也包含了這些信息
nodenmae 字段的返回值由 sethostname() ?系統(tǒng)調(diào)用設(shè)置,gethostname() 則為反向操作,用于獲取系統(tǒng)的主機(jī)名
domainname 字段的返回值由 setdomainname() ?系統(tǒng)調(diào)用設(shè)置,getdomainname() 為反向操作,獲取 NIS 域名
往期精彩
Linux靜態(tài)庫與共享庫基礎(chǔ)筆記
嵌入式Linux根文件系統(tǒng)構(gòu)建指南
移植 ubuntu core 16.04(ubuntu-base)到i.MX6ULL開發(fā)板
覺得本次分享的文章對您有幫助,隨手點(diǎn)[在看]并轉(zhuǎn)發(fā)分享,也是對我的支持。
原文標(biāo)題:Linux系統(tǒng)和進(jìn)程信息筆記
文章出處:【微信公眾號:嵌入式應(yīng)用研究院】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
評論
查看更多