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

dou*_*sd3 5 system-calls kernel-module linux-kernel

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

我该如何打电话?

eep*_*epp 12

为什么要为此实现系统调用?您不希望将syscall添加到现有Linux API.这是用户空间的主要Linux接口,没有人接触系统调用,除了知道他们做什么的顶级内核开发人员.

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

如果要获取内核中的进程列表(例如,在模块中),您应该知道进程在内部保存为以init进程(init_task内核中的符号)开头的双向链表.您应该使用定义的宏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);
Run Code Online (Sandbox Code Playgroud)

这应该可以收集信息.但是,除非你真的知道你在做什么(这需要更多的阅读),否则不要在那里做任何改变.