我是模块编程的新手,我需要进行系统调用来检索系统进程并显示它们消耗了多少 CPU。
我怎样才能打这个电话?
你为什么要为此实现系统调用?您不想向现有 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);
这应该可以收集信息。但是,除非您真的知道自己在做什么(这需要更多阅读),否则不要更改其中的任何内容。
为此有一些系统调用,称为 open 和 read。所有进程的信息都保存在/proc/{pid}
目录中。您可以通过读取相应的文件来收集进程信息。
更多解释在这里:http ://www.tldp.org/LDP/Linux-Filesystem-Hierarchy/html/proc.html