zoukankan      html  css  js  c++  java
  • 编写模块遍历系统中的进程

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

  • 相关阅读:
    Android的webview的设置参数
    禁止RecycleView滑动
    Volley加载不出图片的问题
    LIstview滑动时不加载图片,停止时加载!
    【原创】设计模式开篇—面向对象的软件设计
    [原创]写给自己的总结—2014到2015
    【原创】开车分四个阶段的话,你属于哪个
    【原创】亲身经历的几次合同陷阱
    【转】程序员需谨记的8条团队开发原则
    【转】绩效考核的10大误区
  • 原文地址:https://www.cnblogs.com/top5/p/1699100.html
Copyright © 2011-2022 走看看