当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 1 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 内核链表和定时器
帖子发表于 : 2012-04-25 19:48 

注册: 2011-08-31 10:12
帖子: 47
送出感谢: 0 次
接收感谢: 1
我在学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);
前面一段是我用的国嵌的代码,后面一段是我自己改写的,前一段程序运行没有问题,但后面的的运行会死机,我才开始学这一块,望高手指教。


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 1 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 1 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译