亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 服務器 > Linux服務器 > 正文

Linux 內核通用鏈表學習小結

2024-09-05 23:04:19
字體:
來源:轉載
供稿:網友

描述

在linux內核中封裝了一個通用的雙向鏈表庫,這個通用的鏈表庫有很好的擴展性和封裝性,它給我們提供了一個固定的指針域結構體,我們在使用的時候,只需要在我們定義的數據域結構體中包含這個指針域結構體就可以了,具體的實現、鏈接并不需要我們關心,只要調用提供給我們的相關接口就可以完成了。

傳統的鏈表結構

struct node{  int key;  int val;  node* prev;  node* next; }

linux 內核通用鏈表庫結構

提供給我們的指針域結構體:

struct list_head {  struct list_head *next, *prev;};

我們只需要包含它就可以:

struct node{  int val;  int key;  struct list_head* head;}

可以看到通過這個 list_head 結構就把我們的數據層跟驅動層分開了,而內核提供的各種操作方法接口也只關心 list_head 這個結構,也就是具體鏈接的時候也只鏈接這個list_head 結構,并不關心你數據層定義了什么類型.

一些接口宏定義

//初始化頭指針#define LIST_HEAD_INIT(name) { &(name), &(name) }#define LIST_HEAD(name) /  struct list_head name = LIST_HEAD_INIT(name)//遍歷鏈表#define __list_for_each(pos, head) /  for (pos = (head)->next; pos != (head); pos = pos->next)//獲取節點首地址(不是list_head地址,是數據層節點首地址)#define list_entry(ptr, type, member) /  container_of(ptr, type, member)//container_of在Linux內核中是一個常用的宏,用于從包含在某個//結構中的指針獲得結構本身的指針,通俗地講就是通過結構體變//量中某個成員的首地址進而獲得整個結構體變量的首地址#define container_of(ptr, type, member) ({     /    const typeof( ((type *)0)->member ) *__mptr = (ptr);  /    (type *)( (char *)__mptr - offsetof(type,member) );})#define offsetof(s,m) (size_t)&(((s *)0)->m)

使用方式

typedef struct node{  int val;  int key;  struct list_head* list;}node;//初始化頭指針LIST_HEAD(head);//創建節點node* a = malloc(sizeof(node));node* b = malloc(sizeof(node));//插入鏈表 方式一list_add(&a->list,&head);list_add(&b->list,&head);//插入鏈表 方式二list_add_tail(&a->list,&head);list_add_tail(&b->list,&head);//遍歷鏈表  struct list_head* p;struct node* n;__list_for_each(p,head){  //返回list_head地址,然后再通過list_head地址反推  //節點結構體首地址.  n = list_entry(pos,struct node,list);}

list_add 接口,先入后出原則,有點類似于棧

Linux,內核通用鏈表,linux內核鏈表,linux內核鏈表使用

list_add-先入后出模式

list_add_tail 接口,先入先出原則,有點類似于fifo

Linux,內核通用鏈表,linux內核鏈表,linux內核鏈表使用

list_add-先入先出模式

我們的鏈表節點,實際在內存中的展示形態

Linux,內核通用鏈表,linux內核鏈表,linux內核鏈表使用

節點描述

可以看到最終的形態是,通過指向每個結構體里面的 list_head 類型指針,然后把它們串聯起來的

list_entry 接口,通過結構體變量某個成員的地址,反推結構體首地址,就像 __list_for_each 接口只返回 list_head 地址,所以我們要通過這個成員地址在去獲取它本身的結構體首地址,底層實現方法 container_of 宏

Linux,內核通用鏈表,linux內核鏈表,linux內核鏈表使用

反推結構體首地址

舉個例子

這個例子包括簡單的增、刪、遍歷

#include <linux/kernel.h> #include <linux/module.h> #include <linux/init.h> #include <linux/slab.h> #include <linux/list.h>  MODULE_LICENSE("GPL"); MODULE_AUTHOR("David Xie"); MODULE_DESCRIPTION("List Module"); MODULE_ALIAS("List module");  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(void) {   int i = 0;      //初始化一個鏈表,其實就是把student_list的prev和next指向自身   INIT_LIST_HEAD(&student_list);       pstudent = kmalloc(sizeof(struct student)*5,GFP_KERNEL);//向內核申請5個student結構空間   memset(pstudent,0,sizeof(struct student)*5); //清空,這兩個函數可以由kzalloc單獨做到      for(i=0;i<5;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(pos,&student_list) //list_for_each用來遍歷鏈表,這是個宏定義                    //pos在上面有定義   {     //list_entry用來提取出內核鏈表節點對應的實際結構節點,即根據struct list_head來提取struct student     //第三個參數list就是student結構定義里的屬性list     //list_entry的原理有點復雜,也是linux內核的一個經典實現,這個在上面那篇鏈接文章里也有講解     tmp_student = list_entry(pos,struct student,list);     //打印一些信息,以備驗證結果     printk("<0>student %d name: %s/n",tmp_student->num,tmp_student->name);   }      return 0; }   void mylist_exit(void) {     int i ;   /* 實驗:將for換成list_for_each來遍歷刪除結點,觀察要發生的現象,并考慮解決辦法 */   for(i=0;i<5;i++)   {     //額,刪除節點,只要傳個內核鏈表節點就行了     list_del(&(pstudent[i].list));      }   //釋放空間   kfree(pstudent); }  module_init(mylist_init); module_exit(mylist_exit); 

結束

linux 內核提供的這個通用鏈表庫里面還有很多其他的接口,這里沒有詳細的一一舉例,有興趣的可以自己去看看,在源碼包 include/linux/list.h 文件里面,不過通過閱讀一些源代碼確實對我們也有很大的提高,可以看看高手是如何去設計并實現,還可以學到一些技巧以及對代碼細節的掌握~~.

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲午夜色婷婷在线| 麻豆乱码国产一区二区三区| 精品视频在线播放| 日韩欧美国产激情| 91免费的视频在线播放| 国产97在线视频| 91人成网站www| 久久99热精品这里久久精品| 1769国产精品| 欧美激情精品久久久久| 亚洲精品视频网上网址在线观看| 国产精品欧美一区二区三区奶水| 成人黄色片在线| 亚洲国产日韩欧美综合久久| 国产欧美精品久久久| 国产成人高潮免费观看精品| 欧美午夜女人视频在线| 538国产精品一区二区免费视频| 亚洲午夜av电影| 日韩成人高清在线| 日韩精品视频免费在线观看| 亚洲一区二区三区xxx视频| 在线观看国产欧美| 国产精品久在线观看| 国产精品日韩在线观看| 92国产精品视频| 成人精品视频在线| 美日韩在线视频| 国产精品自产拍在线观看中文| 亚洲www在线观看| 欧美精品久久久久久久久| 亚洲欧美在线播放| 日韩精品有码在线观看| 中文字幕九色91在线| 亚洲图中文字幕| 91久久久久久久久久久久久| 九九久久精品一区| 欧美一乱一性一交一视频| 国产亚洲欧美日韩精品| 91久久在线播放| 亚洲欧美在线免费| 91精品国产色综合久久不卡98口| xxxxx91麻豆| 国内成人精品视频| 国产精品自拍偷拍| 欧美男插女视频| 国产精品久久久亚洲| 国产精品一区二区在线| 欧美激情图片区| 成人性生交大片免费看视频直播| 欧洲s码亚洲m码精品一区| 亚洲精品国产精品自产a区红杏吧| 45www国产精品网站| 日韩精品中文字幕视频在线| 欧美精品久久久久久久| 国产日韩在线精品av| 狠狠操狠狠色综合网| 亚洲成人性视频| 色噜噜狠狠狠综合曰曰曰| 亚洲成人激情图| 欧美精品久久久久| 欧美亚洲另类视频| 亚洲国产精品久久| 亚洲欧美精品在线| 国产一区二区三区在线| 国产精品亚洲一区二区三区| 91高潮精品免费porn| 久久久这里只有精品视频| 国产精品美女久久久久av超清| 亚洲欧洲在线视频| 国产视频精品一区二区三区| 91国产精品91| 国产激情久久久| 久久黄色av网站| 精品久久久久久久久久| 中文国产成人精品| 国产一区二区三区四区福利| 亚洲国产欧美一区二区三区久久| 538国产精品一区二区免费视频| 91精品久久久久久久久久另类| 国产美女久久精品香蕉69| 成人av色在线观看| 国产成人中文字幕| 国产在线观看一区二区三区| 亚洲国产欧美一区二区三区同亚洲| 91夜夜未满十八勿入爽爽影院| 久久福利网址导航| 精品国产一区二区三区久久狼5月| 亚洲精品国产精品国自产在线| 日韩av网址在线| 国产精品久久久久久av下载红粉| 亚洲丁香婷深爱综合| 亚洲综合av影视| 国产精品视频中文字幕91| 一区二区三区四区在线观看视频| 国产成人精品在线观看| 亚洲成人在线网| 日本道色综合久久影院| 国产成人精品在线| 性欧美办公室18xxxxhd| 久久久久久久久久久免费| 欧美日本高清一区| 亚洲无亚洲人成网站77777| 欧美日韩视频在线| 国产精品国产三级国产aⅴ9色| 亚洲精品97久久| 国产成人久久久精品一区| 国产成人综合久久| 亚洲精品成a人在线观看| 97香蕉超级碰碰久久免费软件| 欧美性猛xxx| 成人两性免费视频| 亚洲成人精品视频| 国产在线不卡精品| yw.139尤物在线精品视频| 国产大片精品免费永久看nba| 91色精品视频在线| 亚洲国产成人久久综合一区| 欧美综合在线观看| 亚洲一区二区三区视频播放| 亚洲国产精品电影| 26uuu久久噜噜噜噜| 国产精品午夜国产小视频| 国语自产精品视频在线看抢先版图片| 国产91精品不卡视频| 亚洲国产成人精品电影| 国产丝袜一区视频在线观看| 亚洲国产小视频| 色综合久久88色综合天天看泰| 久久成人18免费网站| 欧洲成人在线观看| 中文字幕国产精品久久| 青青精品视频播放| 中日韩美女免费视频网址在线观看| 欧美激情欧美狂野欧美精品| 91大神福利视频在线| 国产精品自拍视频| 国产美女久久久| 亚洲人成网7777777国产| 欧美一级大片视频| 日韩精品视频在线免费观看| 精品视频久久久| 97视频在线免费观看| 国产精品久久久亚洲| 中文字幕欧美日韩| 日韩在线观看电影| 色小说视频一区| 成人精品视频99在线观看免费| 色综合视频一区中文字幕| 国产不卡av在线免费观看| 97精品国产91久久久久久| 亚洲a一级视频| 色综合色综合久久综合频道88| 亚洲a成v人在线观看| 国产成人福利夜色影视| 久久综合伊人77777尤物| 日韩第一页在线| 亚洲永久免费观看| 国产福利精品在线| 国产亚洲激情视频在线| 亚洲免费中文字幕| 视频在线观看一区二区| 欧美激情免费在线| 美女扒开尿口让男人操亚洲视频网站|