使用 list_for_each 为 Linux 内核进程实现 DFS

Implementing a DFS for Linux Kernel Processes using list_for_each

我正在尝试实现 DFS 以打印出 linux 内核中的所有进程。 list_for_each 函数引起了我的兴趣,如下所示:

list_for_each(list, &init_task->chidlren){
    task = list_entry(list, struct task_struct, sibling);
}

是否可以使用list_for_each函数进行DFS?由于 list_for_each 仅打印出 children 的第一层,因此似乎不可能到达单个 children.

的最深层次

我假设您是从操作系统书籍中获得该代码的。我真的不喜欢他们如何欺骗您认为 list_for_each(list, &init_task->chidlren) 是您需要使用的正确语句。不过,奥利弗对递归的看法是正确的。

您可以执行类似以下操作来完成 DFS。

void some_function(struct task_struct *task) {

struct list_head *list;
struct task_struct *another_task;

printk("Print out the task info here");

list_for_each(list, &task->children) {
    another_task = list_entry(list, struct task_struct, sibling);
    some_function(another_task);
 }
}

由于这是针对 linux 内核模块的,因此您还需要以下内容。

int simple_init(void){

printk(KERN_INFO "Loading Module By Stratos\n");

some_function(&init_task);

return 0;
}

&init_task 用于您需要的代码中,只是不是他们放的地方。