Linux kernel 进行系统调用以获取进程列表

Linux kernel 进行系统调用以获取进程列表,linux-kernel,system-calls,kernel-module,Linux Kernel,System Calls,Kernel Module,我是模块编程新手,我需要进行系统调用来检索系统进程,并显示它们消耗了多少CPU 如何进行此调用?为什么要为此实现系统调用?您不想向现有的Linux API添加系统调用。这是用户空间的主要Linux接口,除了知道自己在做什么的顶级内核开发人员外,没有人涉及系统调用 如果要获取进程及其参数和实时状态的列表,请使用/proc。其中的每个整数目录都有一个现有的进程ID,并包含一组有用的动态文件,ps,top和其他用于打印其输出的文件 如果您想获得内核中的进程列表(例如,在模块中),您应该知道,这些进程在

我是模块编程新手,我需要进行系统调用来检索系统进程,并显示它们消耗了多少CPU

如何进行此调用?

为什么要为此实现系统调用?您不想向现有的Linux API添加系统调用。这是用户空间的主要Linux接口,除了知道自己在做什么的顶级内核开发人员外,没有人涉及系统调用

如果要获取进程及其参数和实时状态的列表,请使用
/proc
。其中的每个整数目录都有一个现有的进程ID,并包含一组有用的动态文件,
ps
top
和其他用于打印其输出的文件

如果您想获得内核中的进程列表(例如,在模块中),您应该知道,这些进程在内部以双链接列表的形式保存,该列表从
init
进程开始(内核中的symbol
init_任务
)。您应该使用
include/linux/sched.h
中定义的宏来获取进程。下面是一个例子:

#include <linux/module.h>
#include <linux/printk.h>
#include <linux/sched.h>

static int __init ex_init(void)
{
    struct task_struct *task;

    for_each_process(task)
        pr_info("%s [%d]\n", task->comm, task->pid);

    return 0;
}

static void __exit ex_fini(void)
{
}

module_init(ex_init);
module_exit(ex_fini);
#包括
#包括
#包括
静态int_uuuinit ex_uinit(void)
{
结构任务\u结构*任务;
对于每个流程(任务)
请购单信息(“%s[%d]\n”,任务->通信,任务->pid);
返回0;
}
静态无效uuu exi_ufini(无效)
{
}
模块_init(ex_init);
模块退出(ex_fini);

这样可以收集信息。但是,除非您真的知道自己在做什么(这需要更多的阅读),否则不要更改其中的任何内容。

有一些系统调用,称为“打开”和“读取”。所有进程的信息都保存在
/proc/{pid}
目录中。您可以通过读取相应的文件来收集流程信息


此处有更多说明:

您指的是
top
命令吗?输出类似于top命令,但我需要实现一个系统调用来实现这一点。您能否提供一些关于如何使用它以及它如何工作的说明,您必须获得启动任务。通常由“current”完成,它是一个marco。这样,您就可以获得当前正在运行的任务。它将返回一个任务。然后您可以开始使用它进行迭代。