linux的樹形程序結構為管理程序提供了很大的方便,不管是核心對程序的管理還是使用者對程序的管理都受惠不少,對於審計也是很有用的,不管執行的什麼程序,都會有一條不會斷的線索將之綁在系統內部。整個系統的情況就是首先核心啟動,接著核心執行緒0派生出init,然後init派生出萬物,有點像上帝造人...不過如果你是撒旦,那麼你可以將程序脫離出這個線索,只和排程的相關鍊錶或者樹聯絡,這樣你的程序就成了完全的不受控體,同時也成了真正的孤兒,再沒有人收養的孤兒。
backtrace或者gdb coredump可以得到函式呼叫堆疊,馮氏機器上,堆疊都是線性堆積的,而程序之間卻可以分時執行(併發機器和馮諾依曼機器是不同的兩種型別,當前的os實現都是在馮氏機器上模擬併發的,這就是分時),因此如果將硬體機器看作乙個平台的話,所有的程序則組成了一棵樹,類似backtrace,可以借助作業系統的支援得到當前程序的呼叫程序,也就是父程序,在linux上,利用proc檔案系統很方便的實現。以下的**可以得到乙個shell指令碼的呼叫者的程序pid和程序名字,同樣的**可以在c中實現,只是將$$換成getpid即可
pid=$$
name=`cat /proc/$pid/stat |awk ''`
ppid=`cat /proc/$pid/stat |awk ''`
pname=`cat /proc/$ppid/stat |awk ''`
#至此name表示當前shell的名稱,而pname則是呼叫者的名稱,pid為當前shell的pid,ppid為其呼叫者的pid(注意,若使用這幾行**,shell指令碼的第一行最好是嚴格的#!/bin/bash,否則指令碼將由bash逐行執行,父程序的名稱也就一直都是bash)。如何能像pstree命令那樣列出系統所有程序的關係,strace pstree之後發現,pstree其實就是讀取的/proc檔案系統的資訊,然後自己將之組織在了一起,linux核心在/proc/pid/stat檔案中匯出了不少有用的資訊,其中就包含有父程序的資訊,參見關於/proc/pid/stat的核心函式(位於fs/proc/array.c):
static int do_task_stat(struct task_struct *task, char * buffer, int whole)
因此我們只需要查詢/proc/pid/stat的第四個字段即可,也就有了上面的指令碼。接下來看一下pstree的原理,既然能找到任意程序父程序並且linux下的所有程序都是同根的,那麼只需要將所有程序連線起來即可,我們有等價的兩種方式,這些方式中都毫不吝嗇的使用了大陣列,絲毫不在乎空間複雜度,旨在揭示原理而不考慮別的:
方式1:int proc[32768][32768]; //橫向為程序pid,縱向為程序的父程序的pid
方式2:int proc[32768]; //陣列元素的索引是程序的pid,其值是父程序的pid
int main(int argc, char **argv)
'", "r");
read (ppid);
方式1:proc[i][ppid] = 1;
方式2:proc[i] = ppid;
}return 0;
}如此,所有的程序就聯絡了起來。最後看一下匯出程序狀態的點陣圖也是不錯的:
static const char *task_state_array = ;
//將程序狀態設計成簡單的向左移位擁有好多好處,最重要的一點是,程序狀態的轉換過程就是狀態機的轉換過程,簡單的移位可以使得程序狀態排他,轉換簡便,向左移位移位著同樣可以不影響其它的向右移位
static inline const char * get_task_state(struct task_struct *tsk)
return *p;
}
linux檢視程序樹
1 以使用者zhangsan登入,完成下列操作 2 使用vim開啟abc.txt檔案,不要編輯 不退出 3 以使用者root登入另乙個終端,完成下列操作 4 檢視整個系統的程序樹,輸出pid號 完整命令列 5 查詢使用者zhangsan的程序樹 6 查詢使用者zhangsan的程序樹,並顯示pid與...
Linux 程序樹檢視工具 pstree
pstree 是 linux 下的乙個用於展示程序樹結構的工具,類似於 tree 展示目錄樹一樣,視覺化地檢視程序的繼承關係。pstree 工具其實是 psmisc 工具集的成員之一,psmisc 工具集由 4 個實用的 linux 程序管理工具 通過 linux 的 proc 檔案系統實現 組成 ...
Linux下如何顯示指定父程序號的程序樹
ps ahp linux 命令,預設情況下 bsd 體系沒有,ports 裝一下 功能說明 以樹狀圖顯示程式。語 法 pstree acghlnpuuv h 程式識別碼 程式識別碼 使用者名稱 補充說明 pstree指令用ascii字元顯示樹狀結構,清楚地表達程式間的相互關係。如果不指定程式識別碼或...