使用 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 用于您需要的代码中,只是不是他们放的地方。
我正在尝试实现 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 用于您需要的代码中,只是不是他们放的地方。