孟阿龙

孟阿龙的博客

他的个人主页  他的博客

编写内核模块实现进程的遍历

孟阿龙  2010年03月29日 星期一 16:47 | 1816次浏览 | 0条评论

编写内核模块实现进程的遍历

编写内核模块实现进程的遍历。这个有点类似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 - : =   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 的值查看不同宏运行产生的结果。

评论

我的评论:

发表评论

请 登录 后发表评论。还没有在Zeuux哲思注册吗?现在 注册 !

暂时没有评论

Zeuux © 2024

京ICP备05028076号