linux内核链表的使用
linux內核鏈表:
鏈表通常包括兩個域:數據域和指針域。
struct list_head{
struct list_head *next,*prev;
};
include/linux/list.h中實現了一套精彩的鏈表數據結構。
傳統的鏈表指針指向下一個節點的頭部。linux鏈表指針指向下一個指針list_head結構(*next),雙向循環。不會隨著外部數據的變化而變化,使它具有通用性。?
-------------------------------------------------------------------
linux內核提供的鏈表主要操作:
1.初始化鏈表頭:
INIT_LIST_HEAD(list_head *head):將*head,*prev指向list本身。
2.插入節點
list_add(struct list_head *new,struct list_head *head)
list_add_tail(struct list_head *new,struct list_head *head)
3.刪除節點
list_del(struct list_head *entry:一個指針結構體)
4.提取數據結構
list_entry(ptr(指向list_head的指針),type(外部結構的類型),member(struct list_head對應的成員名))
已知數據結構中的節點指針ptr,找出數據結構,例
list_entry(aup,struct,autofs,list)
5.遍歷
list_for_each(struct list_head *pos,struct list_head *head(你所需要遍歷的鏈表的鏈表頭))
如:
struct list_head *entry;
struct list_head cs46xx_devs;//鏈表頭
list_for_each(entry,&cs46xx_devs){
card = list_entry(entry,struct cs_card,list);
if(card->dev_midi == minor)
break;
}
看內核代碼看list_entry是如何實現的???
----------------------------------------------------------
內核鏈表的一個具體實現實例:
#include<linux/list.h>
#include<linux/module.h>
#include<linux/kernel.h>
#include<linux/init.h>
#include<linux/slab.h> ?//kfree kmalloc
MODULE_LICENSE("GPL");//(general public license)
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->num,tmp_student->name);
}
return 0;
}//遍歷學生信息
void 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);
轉載于:https://www.cnblogs.com/defen/p/4728430.html
總結
以上是生活随笔為你收集整理的linux内核链表的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: centos6.5 设置ssh无密码登录
- 下一篇: 【转】Linux操作系统下/etc/ho