1、步骤
2、几处经典的用法第一步:先构造一个结构体链表struct student
第二步:定义一个指针*pstudent,让它指向struct student,并分配空间(kmalloc(sizeof(struct student)*5,GFP_KERNEL)其实*5就是分配5个结构体空间,其实就是一个数组形式,然后pstudent指向这个空间)
第三步:list_add()函数向内核链表struct list_head list中添加节点(即每个pstudent[i].list每个成员)
第四步:list_for_each()函数提取结构体数据
#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/slab.h>
#include <linux/list.h>
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 __init 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); // 怎样向结构体name中添加数据???
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);
}
return 0;
}
void __exit mylist_exit()
{
int i;
for(i=0;i<5;i++)
{
list_del(&(pstudent[i].list));
}
kfree(pstudent);
}
module_init(mylist_init);
module_exit(mylist_exit);