使用深度优先树遍历所有任务的内核模块 [英] Kernel module that iterates over all tasks using depth first tree

查看:503
本文介绍了使用深度优先树遍历所有任务的内核模块的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

So I know how to create a kernel and to iterate over the processes linearly by Simply including linux/sched.h and using the following code:

struct task_struct *task;

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

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

How can I print these tasks using a depth first search? I want my output to be similar to the one of ps -eLf.

已提供以下代码补丁供参考:

The following patch of code has been given for reference:

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 */
}

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

and I know that task->comm returns the name and task->pid returns the PID for that task.

使用哪些命令返回状态和父pid?

What commands are used to return the state and parent pid?

推荐答案

这有点旧,但是我碰到了它,因为它似乎是操作系统概念第9版,因此可能还会有其他人来找.

This is a bit old, but I came across it as it seems to be one of the programming projects found in chapter 3 of Operating System Concepts 9th Edition, so others may yet come looking.

开始时使用的代码直接来自本书,但这是一个很好的起点.您只需要实现DFS.这是将完成此操作的代码,它应该很容易解释:

The code you started with is straight from the book, but it is a good starting point. You just need to implement the DFS. Here is the code that will accomplish it, it should be pretty self explanatory:

#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);

这篇关于使用深度优先树遍历所有任务的内核模块的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆