日期:2014-05-16  浏览次数:20699 次

内核模块编程输出进程树
[code=C/C++][/code]
//帮忙看看程序哪里有问题,加载模块后不停止的输出
#include <linux/sched.h> //task_struct
#include <linux/unistd.h> //unix std
#include <linux/list.h> //list_entry ,list_head
#include <linux/init.h> //needed by macros
#include <linux/module.h> //needed by all modules
#include <linux/kernel.h> //needed by all kernel programming

MODULE_LICENSE("GPL");

static int num=-1; //decide means of print tree 
module_param(num,int,S_IRUGO); //input num via "insmod"

struct proc_info
{
struct list_head *task; //point to struct task_struct->tasks
char flag; //visited or not 
int rec; //number of fathers 
};

void pstree(struct proc_info *proc, int total, int ppid, int rec) //print ptree
{
int i,k;
for (i=0; i<total; i++)
{
if(proc[i].flag == 0 && list_entry(proc[i].task,struct task_struct,tasks)->parent->pid==ppid)
{
proc[i].rec=rec+1;
proc[i].flag=1;
for(k=0; k<rec; k++)
{
printk( KERN_ALERT " ");
}
if(list_entry(proc[i].task,struct task_struct,tasks)->pid>0)
{
printk(KERN_ALERT "├──%s(%d)\n",list_entry(proc[i].task,struct task_struct,tasks)->comm,list_entry(proc[i].task,struct task_struct,tasks)->pid);
}
pstree(proc,total,list_entry(proc[i].task,struct task_struct,tasks)->pid,proc[i].rec);
}
}
}
static int printree_init(void) //initialize the module
{
struct task_struct* p;
struct proc_info proc[512];
int total=0;
int rec=0;

proc[total++].task=&p->tasks;
for ( p=&init_task; (p=list_entry((p)->tasks.next,struct task_struct,tasks))!=&init_task; total++) 
{
proc[total].task=&p->tasks;
}
memset(&proc->flag,0,total);//将proc.flag的所有字节初始化为0  
  memset(&proc->rec,0,total);  
if (num<0)
{
pstree(proc,total,0,rec);
}
else
{

}
return 0;
}

static void printree_exit(void) //exit from the module
{  
printk( KERN_ALERT "Hello, kernel!\nGoodbye user\n"); 
}

module_init(printree_init);
module_exit(printree_exit);

------解决方案--------------------
struct proc_info proc[512]; 内核栈一共8K,这一下就用了至少4K甚至很可能是6K,够狠
proc[total++].task=&p->tasks; 这时候p还没初始化吧?
memset(&proc->flag,0,total); proc是个数组,proc->flag是什么意思?能编译过?