gpt4 book ai didi

process - 如何遍历 PCB 以在 Linux 内核模块中显示信息?

转载 作者:行者123 更新时间:2023-12-04 22:36:30 27 4
gpt4 key购买 nike

我想写一个小 Linux 内核模块,它可以显示所有正在运行的进程的 PID。
我有以下代码:

/*
* procInfo.c My Kernel Module for process info
*/

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

/*
* The init function, called when the module is loaded.
* Returns zero if successfully loaded, nonzero otherwise.
*/
static int mod_init(void)
{
printk(KERN_ALERT "ProcInfo sucessfully loaded.\n");
return 0;
}

/*
* The exit function, called when the module is removed.
*/
static void mod_exit(void)
{
printk(KERN_ALERT "ProcInfo sucessfully unloaded.\n");
}

void getProcInfo()
{
printk(KERN_INFO "The process is \"%s\" (pid %i)\n",
current->comm, current->pid);
}

module_init(mod_init);
module_exit(mod_exit);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Rodrigo");

如您所见,我知道我必须使用 *struct task_struct* 结构来获取 PID 和进程名称,但我使用的是当前的,并且我知道存在一些包含所有 PCB 的双链循环列表,所以主要问题是:
我需要添加什么来使用 p-next_task 和 p-prev_task 迭代这个链接的 lisk 以便 getProcInfo 工作?
谢谢!

最佳答案

来自 include/linux/sched.h 的以下宏可能有用:

#define next_task(p) \
list_entry_rcu((p)->tasks.next, struct task_struct, tasks)

#define for_each_process(p) \
for (p = &init_task ; (p = next_task(p)) != &init_task ; )

您可能需要持有 tasklist_lock在调用这些宏之前; mm/oom_kill.c 中有几个如何锁定、迭代和解锁的示例.

关于process - 如何遍历 PCB 以在 Linux 内核模块中显示信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5560229/

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