编写模块遍历系统中的进程

长平狐 发布于 2012/09/03 17:24
阅读 125
收藏 0

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

源程序:list.c

/*****************************************

*功能:利用进程链表遍历当前系统中的所有进程

*同时可以打印出进程的相关信息

*

* ***************************************/

#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 的值查看不同宏运行产生的结果。


原文链接:http://blog.csdn.net/tody_guo/article/details/5447383
加载中
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部