gpt4 book ai didi

c - 使用深度优先搜索迭代任务的子树的内核模块

转载 作者:行者123 更新时间:2023-12-04 03:58:28 24 4
gpt4 key购买 nike

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

struct task_struct *task;

for_each_process(task)
{
printk("Name: %s PID: [%d]\n", task->comm, task->pid);
}
如何使用深度优先搜索打印这些任务?我希望我的输出类似于 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 */
}
我知道 task->comm返回名称和 task->pid返回该任务的 PID。
哪些字段用于状态和父 PID?

最佳答案

这有点老了,但我遇到了它,因为它似乎是 Operating System Concepts 9th Edition 第 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);

关于c - 使用深度优先搜索迭代任务的子树的内核模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19208487/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com