|
我在学linux,遇到个问题望高手指教,是关于内核链表和定时器的; 我这里有两个程序,第一个是 #include <linux/kernel.h> #include <linux/module.h> #include <linux/init.h> #include <linux/slab.h> #include <linux/list.h> #include <linux/timer.h> /*timer*/ #include <asm/uaccess.h> /*jiffies*/
MODULE_LICENSE("GPL"); MODULE_AUTHOR("David Xie"); MODULE_DESCRIPTION("List Module"); MODULE_ALIAS("List module");
struct timer_list timer;
void timer_function(int para) { printk("<0>Timer Expired and para is %d !!\n",para); //module_exit(timer_exit); }
struct student { char name[100]; int num; struct list_head list; };
struct student *pstudent; struct student *tmp_student; struct list_head student_list; struct list_head *pos;
int mylist_init() { int i = 0; INIT_LIST_HEAD(&student_list); pstudent = kmalloc(sizeof(struct student)*5,GFP_KERNEL); memset(pstudent,0,sizeof(struct student)*5); for(i=0;i<5;i++) { sprintf(pstudent[i].name,"Student%d",i+1); pstudent[i].num = i+1; list_add( &(pstudent[i].list), &student_list); } list_for_each(pos,&student_list) { tmp_student = list_entry(pos,struct student,list); printk("<0>student %d name: %s\n",tmp_student->num,tmp_student->name); } init_timer(&timer); timer.data = 5; timer.expires = jiffies + (20 * HZ); timer.function = timer_function; add_timer(&timer); return 0; }
void mylist_exit() { int i ; /* ʵÑ飺œ«for»»³Élist_for_eachÀޱéÀúÉŸ³ýœáµã£¬¹Û²ìÒª·¢ÉúµÄÏÖÏ󣬲¢¿ŒÂÇœâŸö°ì·š */ for(i=0;i<5;i++) { list_del(&(pstudent[i].list)); } del_timer( &timer ); kfree(pstudent); }
module_init(mylist_init); module_exit(mylist_exit); 第二个是: #include <linux/kernel.h> #include <linux/module.h> #include <linux/init.h> #include <linux/slab.h> #include <linux/list.h> #include <linux/timer.h> /*timer*/ #include <asm/uaccess.h> /*jiffies*/
MODULE_LICENSE("GPL"); MODULE_AUTHOR("awei"); MODULE_DESCRIPTION("List Module"); MODULE_ALIAS("List module");
struct timer_list timer; void timer_function(void);
struct name { char names[6]; struct list_head list; };
struct name *tmp_name, *psname; struct list_head mylist, *pos;
void mylist_init() { int i; INIT_LIST_HEAD( &mylist ); psname = kmalloc(sizeof(struct name)*5,GFP_KERNEL); memset(psname,0,sizeof(struct name)*5); for(i=0;i<5;i++) { sprintf(psname[i].names,"name%d",i+1); list_add_tail(&(psname[i].list), &mylist); }
init_timer(&timer); timer.data = 5; timer.expires = jiffies + (20 * HZ); timer.function = timer_function; add_timer(&timer);
list_for_each(pos, &mylist) //pos为内核代码固定的参数名 { tmp_name = list_entry(pos, struct name, list); printk("<3> name: %s\n",tmp_name->names); } }
void mylist_exit() { int i; for(i=0;i<5;i++) { list_del(&(psname[i].list)); } kfree(psname); del_timer( &timer ); }
void timer_function() { printk("<0>Timer Expired and para is !!\n"); list_for_each(pos, &mylist) //pos为内核代码固定的参数名 { tmp_name = list_entry(pos, struct name, list); printk("<3> (in timer_function )name: %s\n",tmp_name->names); } }
module_init(mylist_init); module_exit(mylist_exit); 前面一段是我用的国嵌的代码,后面一段是我自己改写的,前一段程序运行没有问题,但后面的的运行会死机,我才开始学这一块,望高手指教。
|