依據指標鏈結方式的不同,會得到不同的串列結果
• 由 tasks 構成的行程的環狀雙向鏈結串列
串列首為 init_task,即 swapper(0),最後一個行程的 tasks 指標會指回 swapper(0)
假設系統中只存在 3個行程,分別為 swapper、init 及 Process-X,則 tasks 串列如下:
(以下的圖形都只畫出 next 方向的指標)
欲走訪 tasks 串列的所有節點,可使用以下方式:
struct task_struct *task = NULL;
for_each_process( task )
{
//列出所有行程的名稱與 PID
printk("%s(%d)\n", task->comm, task->pid);
}
• 由 children & sibliing 構成的父程序與子程序串列
每一個行程都可能會衍生出子行程,以 children 指標表示其第一個子行程
而子行程彼此之間以 sibling 指標鏈結,最後一個子行程的 sibling 指標則指向父行程
至於沒有子行程的行程,其 children 指標會指向自己
假設 Process-A 衍生出 Process-B,而 Process-B 衍生出 Process-C
則 children & sibling 串列如下:
假設 Process-D 衍生出 Process-E 與 Process-F,則 children & sibling 串列如下:
欲搜尋目前行程的所有子行程,可使用以下方式:
struct task_struct *task = NULL;
struct list_head *list = NULL;
list_for_each(list, &(current->children))
{
task = list_entry(list, struct task_struct, sibling);
//現在 task 已指向 current 的某個子行程
}
沒有留言:
張貼留言