#include <linux/init.h>
#include <linux/module.h>
#include <linux/list.h>
#include <linux/slab.h>
#define STU_NUM (5)
struct student {
char name[100];
int num;
struct list_head list;
};
struct list_head student_list;
struct student *pstudent;
struct list_head *pos;
struct student *tmp_student;
static int __init test_list_init(void)
{
int i = 0;
int ret = -1;
printk(KERN_INFO "----test_list_init----\n");
INIT_LIST_HEAD(&student_list);
pstudent = kmalloc(sizeof(struct student) * STU_NUM, GFP_KERNEL);
if(unlikely(!pstudent)){
ret = -ENOMEM;
pr_err("kmalloc failed.\n");
return ret;
}
memset(pstudent, 0, sizeof(struct student) * STU_NUM);
for(i = 0; i < STU_NUM; i++){
sprintf(pstudent[i].name, "Student%d", i+1);
pstudent[i].num = i+1;
//加入链表节点,list_add是在表头插入,list_add_tail是在表尾插入
list_add(&(pstudent[i].list), &student_list);//参数1是要插入的节点地址,参数2是链表头地址
}
/* 使用宏定义list_for_each来遍历链表*/
list_for_each(pos,&student_list) {
tmp_student = list_entry(pos, struct student, list); // 每一个条目
printk(KERN_INFO "student %d name: %s\n", tmp_student->num, tmp_student->name);
}
return 0;
}
static void __exit test_list_exit(void)
{
int i;
printk(KERN_INFO "----test_list_exit----\n");
for(i = 0; i < STU_NUM; i++){
list_del(&(pstudent[i].list));
}
kfree(pstudent);
}
module_init(test_list_init);
module_exit(test_list_exit);
MODULE_LICENSE("GPL v2");
MODULE_AUTHOR("xz@vi-chip.com.cn");
MODULE_DESCRIPTION("List module");
MODULE_ALIAS("List module");
#include <linux/module.h>
#include <linux/list.h>
#include <linux/slab.h>
#define STU_NUM (5)
struct student {
char name[100];
int num;
struct list_head list;
};
struct list_head student_list;
struct student *pstudent;
struct list_head *pos;
struct student *tmp_student;
static int __init test_list_init(void)
{
int i = 0;
int ret = -1;
printk(KERN_INFO "----test_list_init----\n");
INIT_LIST_HEAD(&student_list);
pstudent = kmalloc(sizeof(struct student) * STU_NUM, GFP_KERNEL);
if(unlikely(!pstudent)){
ret = -ENOMEM;
pr_err("kmalloc failed.\n");
return ret;
}
memset(pstudent, 0, sizeof(struct student) * STU_NUM);
for(i = 0; i < STU_NUM; i++){
sprintf(pstudent[i].name, "Student%d", i+1);
pstudent[i].num = i+1;
//加入链表节点,list_add是在表头插入,list_add_tail是在表尾插入
list_add(&(pstudent[i].list), &student_list);//参数1是要插入的节点地址,参数2是链表头地址
}
/* 使用宏定义list_for_each来遍历链表*/
list_for_each(pos,&student_list) {
tmp_student = list_entry(pos, struct student, list); // 每一个条目
printk(KERN_INFO "student %d name: %s\n", tmp_student->num, tmp_student->name);
}
return 0;
}
static void __exit test_list_exit(void)
{
int i;
printk(KERN_INFO "----test_list_exit----\n");
for(i = 0; i < STU_NUM; i++){
list_del(&(pstudent[i].list));
}
kfree(pstudent);
}
module_init(test_list_init);
module_exit(test_list_exit);
MODULE_LICENSE("GPL v2");
MODULE_AUTHOR("xz@vi-chip.com.cn");
MODULE_DESCRIPTION("List module");
MODULE_ALIAS("List module");