日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

linux内核链表的使用

發布時間:2025/3/20 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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内核链表的使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。