使用深度优先树迭代所有任务的内核模块

Has*_*lil 9 task linux-kernel depth-first-search

所以我知道如何通过简单地包含linux/sched.h和使用以下代码来创建内核并线性迭代这些进程:

struct task_struct *task;

for_each_process(task)
{
   printk("Name: %s PID: [%d]\n", task->comm, task->pid);
}
Run Code Online (Sandbox Code Playgroud)

如何使用深度优先搜索打印这些任务?我希望我的输出类似于其中一个ps -eLf.

以下代码补丁已供参考:

struct task_struct *task;
struct list_head *list;
list_for_each(list, &init_task->children) {
    task = list_entry(list, struct task_struct, sibling);
    /* task points to the next child in the list */
}
Run Code Online (Sandbox Code Playgroud)

我知道它task->comm返回名称并task->pid返回该任务的PID.

什么命令用于返回状态和父pid?

tam*_*am5 8

这有点旧,但我遇到它,因为它似乎是操作系统概念第9版第3章中的编程项目之一,所以其他人可能会来看.

你开始使用的代码直接来自本书,但它是一个很好的起点.您只需要实现DFS.这是完成它的代码,它应该是非常自我解释的:

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/init.h>

/**
 * Performs a DFS on a given task's children.
 *
 * @void
 */
void DFS(struct task_struct *task)
{   
    struct task_struct *child;
    struct list_head *list;

    printk("name: %s, pid: [%d], state: %li\n", task->comm, task->pid, task->state);
    list_for_each(list, &task->children) {
        child = list_entry(list, struct task_struct, sibling);
        DFS(child);
    }
}

/**
 * This function is called when the module is loaded. 
 *
 * @return 0  upon success
 */ 
int task_lister_init(void)
{
    printk(KERN_INFO "Loading Task Lister Module...\n");
    DFS(&init_task);

    return 0;
}

/**
 * This function is called when the module is removed.
 *
 * @void
 */
void task_lister_exit(void)
{
    printk(KERN_INFO "Removing Task Lister Module...\n");
}

// Macros for registering module entry and exit points.
module_init(task_lister_init);
module_exit(task_lister_exit);
Run Code Online (Sandbox Code Playgroud)