Chinaunix首页 | 论坛 | 博客
  • 博客访问: 928650
  • 博文数量: 146
  • 博客积分: 3321
  • 博客等级: 中校
  • 技术积分: 1523
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-29 10:32
文章分类

全部博文(146)

文章存档

2014年(2)

2013年(5)

2012年(4)

2011年(6)

2010年(30)

2009年(75)

2008年(24)

分类: LINUX

2010-03-26 16:22:10

编写内核模块实现进程的遍历。这个有点类似ps命令了。

源程序:list.c

/*****************************************
 *功能:利用进程链表遍历当前系统中的所有进程
 *同时可以打印出进程的相关信息
 *author:孟阿龙

 *http://boyan.cublog.cn
 * ***************************************/


#include <linux/list.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/sched.h>

#define METHOD 2

static int list_init(void)
{
    struct task_struct *task, *p;
    struct list_head *pos;
    int count;
    char *method;

    count = 0; /*下面这些初始化完全是为了消除编译时的警告信息*/
    p = NULL;
    task = NULL;
    pos = NULL;
    method = NULL;

    task = &init_task;
    printk(KERN_ALERT"PID\tCOMM\n");

    switch(METHOD) {
        case 1:
            method="list_for_each";
            break;
        case 2:
            method="for_each_process";
            break;
        case 3:
            method="list_for_each_entry";
            break;
    }

    printk( "The method is %s\n", method );
#if METHOD == 1
    list_for_each( pos, &task->tasks ) {
        p = list_entry( pos, struct task_struct, tasks );
        count++;
        printk( KERN_ALERT "%d\t%s\n", p->pid, p->comm );
    }
#elif METHOD == 2
    for_each_process(task) {
        count++;
        printk( KERN_ALERT "%d\t%s\n", task->pid, task->comm );
    }
#elif METHOD == 3
    list_for_each_entry( p, &task->tasks, tasks ) {
        count++;
        printk( KERN_ALERT "%d\t%s\n", p->pid, p->comm );
    }
#endif

    printk("系统当前共 %d 个进程!!", count);
    return 0;
}
static void list_exit(void)
{
    printk( KERN_ALERT "GOOD BYE!!\n");
}
module_init( list_init );
module_exit( list_exit );
MODULE_AUTHOR( "Along" );
MODULE_LICENSE( "GPL" );


我的Makefile:

obj-m := list.o
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
all:
    make -C $(KERNELDIR) M=$(PWD) modules
clean:
    make -C $(KERNELDIR) M=$(PWD) clean


这个程序主要用到了几个关键的宏list_for_each,list_for_each_entry,for_each_process 。我们可以通过修改程序中 METHOD 的值查看不同宏运行产生的结果。
阅读(718) | 评论(0) | 转发(0) |
0

上一篇:skyeye 安装

下一篇:在linux内核中读写文件

给主人留下些什么吧!~~