【问题标题】:Make a system call to get list of processes进行系统调用以获取进程列表
【发布时间】:2013-08-26 20:31:54
【问题描述】:

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

我该如何拨打这个电话?

【问题讨论】:

  • 你指的是top命令吗?
  • 输出就像一个顶级命令,但我需要实现一个系统调用来做到这一点。

标签: linux-kernel system-calls kernel-module


【解决方案1】:

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

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

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

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

【讨论】:

  • 你能解释一下如何使用它以及它是如何工作的
  • 好吧,你必须得到开始任务。它通常由“当前”完成,这是一个宏。有了这个,你可以得到当前正在运行的任务。它将返回一个任务。然后你现在就可以开始迭代了。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-20
    • 2012-02-12
    • 2018-03-19
    • 1970-01-01
    • 2016-01-13
    • 2014-12-20
    相关资源
    最近更新 更多