5

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

我怎样才能打这个电话?

4

2 回答 2

12

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

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

如果您想获取内核中的进程列表(例如,在模块中),您应该知道进程在内部保存为以进程开头的双向链表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);

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

于 2013-08-23T19:11:45.373 回答
1

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

更多解释在这里:http ://www.tldp.org/LDP/Linux-Filesystem-Hierarchy/html/proc.html

于 2014-12-01T19:12:01.267 回答