前面我們詳細介紹瞭如何實現內核鏈表,實際上內核中已經爲我們實現了內核鏈表,給我提供了一些操作內核鏈表的API,接下來我們將在驅動模塊中使用內核鏈表。
首先我們瞭解幾個常用的API:
以下是代碼實例(由於前面已經對內核鏈表做了詳解,在此不再贅述):
#include <linux/init.h>
#include <linux/module.h>
#include <asm/current.h>
#include <linux/sched.h>
#include <linux/list.h>
#include <linux/slab.h>
#define N 32
struct student{ //學生信息結構體
char name[N];
int id;
float score;
struct list_head list; //內核鏈表字段
};
struct student *stup;
struct student *tmp_stup;
struct list_head stu_list;
struct list_head *pos;
static __init int hello_init(void)//模塊加載入口
{
int i,ret;
printk("%s:%d pid=%d\n",__func__,__LINE__,current->pid);//打印函數信息用於調試
//初始化內核鏈表 學生表
INIT_LIST_HEAD(&stu_list);
//爲學生信息結構體分配空間
stup=kmalloc(sizeof(struct student)*5,GFP_KERNEL);
if(IS_ERR(stup)){ //判斷是否爲NULL
printk("fail to kmalloc");
ret=PTR_ERR(stup); //得到錯誤信息返回
goto ERR1;
};
memset(stup,0,sizeof(struct student)*5);//清空結構體
for(i=0;i<5;i++){ //賦值 並插入鏈表
sprintf(stup[i].name,"stuent%d",i);
stup[i].id=i;
//stup[i].score=i*10;
//list_add(&(stup[i].list),&stu_list);
list_add_tail(&(stup[i].list),&stu_list);
};
list_for_each(pos,&stu_list){ //遍歷學生信息
tmp_stup=list_entry(pos,struct student,list);//鏈接因子得到對象
printk("id=%d name=%s \n",tmp_stup->id,tmp_stup->name);
};
return 0;
ERR1:
return ret;
}
static __exit void hello_exit(void)//模塊卸載入口
{ int i;
printk("%s:%d pid=%d\n",__func__,__LINE__,current->pid);
for(i=0;i<5;i++){
list_del(&(stup[i].list)); //刪除節點
};
kfree(stup);//釋放分配的學生結構體空間
}
module_init(hello_init);
module_exit(hello_exit);
MODULE_LICENSE("Dual BSD/GPL");