【发布时间】:2013-08-26 20:31:54
【问题描述】:
我是模块编程的新手,我需要进行系统调用来检索系统进程并显示它们消耗了多少 CPU。
我该如何拨打这个电话?
【问题讨论】:
-
你指的是
top命令吗? -
输出就像一个顶级命令,但我需要实现一个系统调用来做到这一点。
标签: linux-kernel system-calls kernel-module
我是模块编程的新手,我需要进行系统调用来检索系统进程并显示它们消耗了多少 CPU。
我该如何拨打这个电话?
【问题讨论】:
top命令吗?
标签: linux-kernel system-calls kernel-module
你为什么要实现一个系统调用呢?您不想向现有 Linux API 添加系统调用。这是用户空间的主要 Linux 接口,除了知道自己做什么的顶级内核开发人员外,没有人接触系统调用。
如果您想获取进程列表及其参数和实时状态,请使用/proc。其中的每个整数目录都有一个现有的进程 ID,并包含一堆有用的动态文件,ps、top 和其他人用来打印它们的输出。
如果您想获取内核中的进程列表(例如,在模块中),您应该知道进程在内部保存为以init 进程开头的双向链表(符号init_task in内核)。您应该使用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
【讨论】: