所以我知道如何通过简单地包括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的命令是什么?
答案 0 :(得分:9)
这有点旧,但是我发现它似乎是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);
答案 1 :(得分:1)
您可以使用task->state /* -1 unrunnable, 0 runnable, >0 stopped */
使用task->parent->pid
答案 2 :(得分:0)
对于uid,tgid你可以在task_struct中引用cred结构。对于优先级,您可以参考rt_priority(实时优先级)和prio字段。对于其他字段,您可以参考proc目录(因为ps将从proc获取输入)。