新聞中心
Linux作為一種開源操作系統(tǒng),其獨(dú)特的設(shè)計(jì)讓人們擁有更多的選擇和自由。在Linux中,進(jìn)程是操作系統(tǒng)管理的最基本的單位,Linux操作系統(tǒng)中的所有工作都是通過進(jìn)程完成的。為了有效地管理進(jìn)程,Linux系統(tǒng)提供了許多用于查看和管理進(jìn)程的工具,其中pstree是一個(gè)廣泛使用的工具之一。本文將探究pstree的源碼實(shí)現(xiàn),幫助讀者更好地了解它的工作原理。

網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)建站!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、小程序開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了含山免費(fèi)建站歡迎大家使用!
一、什么是進(jìn)程樹?
在Linux系統(tǒng)中,進(jìn)程不僅僅是一個(gè)簡單的程序執(zhí)行體,它還具有父子關(guān)系。例如,每個(gè)進(jìn)程都有一個(gè)父進(jìn)程(除了init進(jìn)程)和子進(jìn)程。Linux操作系統(tǒng)中的所有進(jìn)程都可以形成一個(gè)進(jìn)程樹。進(jìn)程樹指的是一組相互關(guān)聯(lián)的進(jìn)程,這些進(jìn)程之間是按照父子關(guān)系組成的。
二、什么是pstree?
pstree是一款Linux命令行工具,用于顯示系統(tǒng)中所有進(jìn)程以及它們的層次結(jié)構(gòu)。它能夠以樹狀結(jié)構(gòu)的方式顯示進(jìn)程,顯示進(jìn)程之間的父子關(guān)系,清晰地顯示進(jìn)程之間的層次結(jié)構(gòu)。pstree的使用方法非常簡單,只需要在控制臺(tái)中輸入pstree命令,就會(huì)顯示系統(tǒng)中所有進(jìn)程的樹狀結(jié)構(gòu)。
三、pstree的實(shí)現(xiàn)原理
1.主要函數(shù)
pstree的核心代碼是由一個(gè)C函數(shù)實(shí)現(xiàn)的,該函數(shù)名為print_tree()函數(shù),這個(gè)函數(shù)主要是通過遞歸的方式遍歷整個(gè)進(jìn)程樹,并輸出樹形結(jié)構(gòu)。 具體思路是:從進(jìn)程根節(jié)點(diǎn)開始遍歷,在遍歷的過程中,遞歸遍歷下一層的進(jìn)程,從而輸出整個(gè)進(jìn)程樹。print_tree()函數(shù)的代碼如下所示:
void print_tree(pid_t pid, bool is_last) {
/* pid的信息通過獲取/proc/pid/stat文件中的信息得到 */
ProcessInfo *pi = procstat_get_process_info(pid);
if (pi == NULL) {
return;
}
/* 輸出每個(gè)進(jìn)程的名稱-指針的格式 */
printf(is_last ? “\\– ” : “|–“);
printf(“%s (%d)\n”, pi->name, (int)pid);
/* 遞歸 */
for (int i = 0; i n_children; i++) {
pid_t child_pid = pi->childrenpids[i];
/* 如果時(shí)最后一個(gè)進(jìn)程則輸出 ‘|’ */
print_tree(child_pid, i == pi->n_children – 1);
}
/* 釋放內(nèi)存 */
procstat_free_process_info(pi);
}
在該函數(shù)中,print_tree()函數(shù)是由pid_t pid和bool is_last兩個(gè)參數(shù)調(diào)用的,pid用于確定需要遍歷的進(jìn)程,is_last參數(shù)用于記錄是否是該層中的最后一個(gè)子進(jìn)程,以便于顯示不同的符號(hào)。
2.進(jìn)程狀態(tài)信息獲取函數(shù)
在打印整個(gè)進(jìn)程樹的時(shí)候,需要獲取每個(gè)進(jìn)程的相關(guān)信息,這些信息主要包括進(jìn)程ID、父進(jìn)程ID、進(jìn)程狀態(tài)、進(jìn)程優(yōu)先級(jí)等。獲取這些信息的方式是通過讀取/proc/pid/stat文件的方式實(shí)現(xiàn)的。/proc/pid/stat文件中存儲(chǔ)了進(jìn)程的相關(guān)信息,包括進(jìn)程ID、進(jìn)程名稱等,pstree通過讀取該文件來獲取進(jìn)程的相關(guān)信息。獲取進(jìn)程的方法主要是由兩個(gè)C函數(shù)實(shí)現(xiàn)的,分別是processinfo_get_process_info()函數(shù)和processinfo_free_process_info()函數(shù)。其中processinfo_get_process_info()函數(shù)用于獲取進(jìn)程信息,processinfo_free_process_info()函數(shù)用于釋放進(jìn)程信息的內(nèi)存,避免內(nèi)存泄漏。
四、pstree運(yùn)行結(jié)果分析
下面是一個(gè)示例輸出的結(jié)果,可以看到pstree以樹形結(jié)構(gòu)的形式展示系統(tǒng)中所有進(jìn)程,并以不同的符號(hào)(“|”和“\”)表示各個(gè)進(jìn)程之間的父子關(guān)系。
systemd─┬─ModemManager───2*[{ModemManager}]
├─NetworkManager─┬─dhcpd
│ ├─{NetworkManager}
│ └─2*[{NetworkManager}]
├─accounts-daemon───2*[{accounts-daemon}]
├─agetty
├─avahi-daemon───avahi-daemon
├─bluetoothd
├─colord───2*[{colord}]
├─cron
├─2*[dbus-daemon]
├─dnasq
├─gdm3─┬─gdm-session-wor─┬─Xorg───{Xorg}
│ │ ├─gnome-session-b─┬─gnome-shell─┬─ibus-daemon─┬─{ibus-daemon}
│ │ │ │ │ ├─{gnome-shell}
│ │ │ │ │ └─3*[{ibus-daemon}]
│ │ │ │ ├─gsd-sharing─┬─{gsd-sharing}
│ │ │ │ │ ├──3*[{gsd-sharing}]
│ │ │ │ │ └─2*[{gsd-sharing}]
│ │ │ │ ├─gsd-xset─┬─{gsd-xset}
│ │ │ │ │ └─2*[{gsd-xset}]
│ │ │ │ ├─gnome-shell-cal───2*[{gnome-shell-cal}]
│ │ │ │ ├─3*[{gnome-shell-b}]
│ │ │ │ ├─3*[{gdm-session-wor}]
│ │ │ │ └─3*[{gnome-session-b}]
│ │ │ ├─2*[ibus-x11───{ibus-x11}]
│ │ │ ├─nautilus-desktop─┬─{nautilus-desktop}
│ │ │ │ └─3*[{nautilus-desktop}]
│ │ │ └─3*[{gdm-session-wor}]
│ │ └─{gdm-session-wor}
│ └─2*[{gdm3}]
├─irqbalance───{irqbalance}
├─kerneloops───{kerneloops}
├─2*[kworker/0:0H]
├─2*[kworker/u2:0]
├─2*[migration/0]
├─2*[rcu_gp]
├─rcu_sched
├─rsyslogd───3*[{rsyslogd}]
├─rtkit-daemon───2*[{rtkit-daemon}]
├─artd───{artd}
├─systemd-journal
├─systemd-logind
├─systemd-timesyn───{systemd-timesyn}
├─thermald───{thermald}
└─udisksd───3*[{udisksd}]
從輸出結(jié)果可以看出,pstree能夠清晰地樹形顯示系統(tǒng)中的所有進(jìn)程,每個(gè)進(jìn)程都有其父子關(guān)系,能夠方便地查看進(jìn)程的層次結(jié)構(gòu),很方便地進(jìn)行排錯(cuò)、分析和優(yōu)化進(jìn)程。同時(shí),pstree還能根據(jù)進(jìn)程的PID、名稱、用戶等排序輸出結(jié)果,更加方便用戶的使用。
進(jìn)程是Linux操作系統(tǒng)中最基本的單位,而pstree是一款廣泛使用的工具,能夠清晰地樹形顯示系統(tǒng)中的所有進(jìn)程。pstree的實(shí)現(xiàn)原理是通過遍歷整個(gè)進(jìn)程樹,并以遞歸的方式輸出樹形結(jié)構(gòu)??梢愿鶕?jù)PID、名稱、用戶等不同的方式排序輸出結(jié)果,更加方便用戶進(jìn)行進(jìn)程的搜索和分析。本文對(duì)pstree的源碼實(shí)現(xiàn)進(jìn)行了探究,希望能夠幫助讀者更好地了解它的工作原理,并在實(shí)際操作中得到應(yīng)用和優(yōu)化。
相關(guān)問題拓展閱讀:
- linux什么命令查看程序運(yùn)行狀態(tài)
linux什么命令查看程序運(yùn)行狀態(tài)
ps? top ?
查看凱卜系統(tǒng)所有正在運(yùn)行的進(jìn)程,可以用ps aux命令(它的-a參數(shù)表示,不與終端有關(guān)的進(jìn)程也顯示出來)。還有一個(gè)和ps命令相似的命令是pstree,pstree命令用于列出正在運(yùn)行的進(jìn)程的進(jìn)程樹,所謂進(jìn)程樹就是顯示有關(guān)系的搭孫兆進(jìn)程的
相關(guān)性
,也就是顯示父子進(jìn)程之間的關(guān)系。pstree命令的常見用法是:pstree -Aup
-A參數(shù)表示:顯示出來的進(jìn)程樹連接,用ASCII字符來顯示
-u參數(shù)表示:列知租出進(jìn)程的所屬用戶
-p參數(shù)表示:列出每個(gè)進(jìn)程的PID
ps命令和pstree命令是選取一個(gè)時(shí)間點(diǎn)的進(jìn)程狀態(tài),還有一個(gè)top命令可以持續(xù)檢測進(jìn)程運(yùn)行狀態(tài),它顯示的是動(dòng)態(tài)的信息,有點(diǎn)像Windows的
任務(wù)管理器
(不過top命令是
命令行
),使用方法:
top -d 數(shù)字
-d參數(shù)后面接一個(gè)數(shù)字表示幾秒更新一次顯示,一般可以設(shè)置成2,表示2秒一更新。
ps 命令
linux pstree源碼的介紹就聊到這里吧,感謝你花時(shí)間閱讀本站內(nèi)容,更多關(guān)于linux pstree源碼,Linux中的進(jìn)程樹:探究pstree源碼,linux什么命令查看程序運(yùn)行狀態(tài)的信息別忘了在本站進(jìn)行查找喔。
成都創(chuàng)新互聯(lián)科技有限公司,是一家專注于互聯(lián)網(wǎng)、IDC服務(wù)、應(yīng)用軟件開發(fā)、網(wǎng)站建設(shè)推廣的公司,為客戶提供互聯(lián)網(wǎng)基礎(chǔ)服務(wù)!
創(chuàng)新互聯(lián)(www.cdcxhl.com)提供簡單好用,價(jià)格厚道的香港/美國云服務(wù)器和獨(dú)立服務(wù)器。創(chuàng)新互聯(lián)——四川成都IDC機(jī)房服務(wù)器托管/機(jī)柜租用。為您精選優(yōu)質(zhì)idc數(shù)據(jù)中心機(jī)房租用、服務(wù)器托管、機(jī)柜租賃、大帶寬租用,高電服務(wù)器托管,算力服務(wù)器租用,可選線路電信、移動(dòng)、聯(lián)通機(jī)房等。
網(wǎng)頁名稱:Linux中的進(jìn)程樹:探究pstree源碼(linuxpstree源碼)
文章網(wǎng)址:http://www.dlmjj.cn/article/coppepi.html


咨詢
建站咨詢
