国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > Linux > 正文

簡單理解linux內(nèi)核的鏈表教程

2024-08-27 23:55:19
字體:
供稿:網(wǎng)友
  Linux內(nèi)核鏈表定義在include/linux/list.h文件中,Linux內(nèi)核鏈表它是一個雙向循環(huán)鏈表,里面只包含兩個struct list_head結(jié)構(gòu)指針.
 
  在看linux內(nèi)核源代碼的時候,經(jīng)常在一些結(jié)構(gòu)里看見struct list_head結(jié)構(gòu),找了一下源代碼,在list.h中,有對這個結(jié)構(gòu)的定義,這個就是linux內(nèi)核中的鏈表結(jié)構(gòu).
 
  仔細(xì)看看這個結(jié)構(gòu),就可以發(fā)現(xiàn)它和以前在講數(shù)據(jù)結(jié)構(gòu)的時候的鏈表有很大的差別——沒有數(shù)據(jù),list_head結(jié)構(gòu)中僅僅包含了兩個自己結(jié)構(gòu)的指針,用來組建雙向循環(huán)鏈表,最大的疑問就是,這個鏈表結(jié)構(gòu)如何保存數(shù)據(jù)呢?
 
  在list.h中,定義了list_entry宏,這個宏就是用來提取包含鏈表項的結(jié)構(gòu)的指針,從list_entry宏的定義可以看到,它僅僅調(diào)用了kernel.h中的container_of()宏,后者真正實現(xiàn)了通過鏈表結(jié)構(gòu)來獲取包含鏈表的結(jié)構(gòu)的地址(指針).
 
  container_of(ptr, type, member)宏需要三個參數(shù),ptr:指向鏈表的指針;type:包含鏈表項結(jié)構(gòu)的類型;member:鏈表項在結(jié)構(gòu)中的名稱.
 
  其中的實現(xiàn)有兩句語句:
 
  const typeof( ((type *)0)->member ) *__mptr = (ptr); //聲明臨時變量__mptr,儲存鏈表的指針,這個變量的類型由gcc擴(kuò)展函數(shù)typeof從結(jié)構(gòu)的成員變量member中獲取
 
  ((type *)0)->member將地址0強(qiáng)制轉(zhuǎn)換為結(jié)構(gòu)的指針,并獲取鏈表的對象.--phpfensi.com
 
  (type *)((char*) __mptr – offsetof(type, member)); //將上句獲取到的地址減去鏈表項在結(jié)構(gòu)中的偏移量,得到結(jié)構(gòu)的真實地址,并將這個地址轉(zhuǎn)換成所需類型結(jié)構(gòu)的指針
 
  offsetof(type, member)函數(shù)定義在stddef.h中,它返回member在結(jié)構(gòu)type中的偏移量,返回值為size_t
 
  通過這宏,就返回了包含鏈表項的結(jié)構(gòu)的指針,然后就可以通過這個指針來訪問結(jié)構(gòu)中的數(shù)據(jù)了,這樣定義的鏈表,對于沒有模板的c語言來說,可以有效的避免重復(fù)寫很多包含不同數(shù)據(jù)類型的結(jié)構(gòu),不用在為每種不同的數(shù)據(jù)類型寫一個鏈表節(jié)點(diǎn)項了.

(編輯:武林網(wǎng))

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 鄂托克前旗| 屏东县| 广汉市| 柳江县| 绥中县| 班戈县| 北票市| 伊通| 财经| 论坛| 石柱| 郯城县| 建湖县| 宜川县| 云梦县| 酉阳| 四子王旗| 崇信县| 广饶县| 正宁县| 阿合奇县| 泉州市| 承德县| 莲花县| 信丰县| 兴业县| 巴里| 安阳市| 凤翔县| 张掖市| 通海县| 宜都市| 霍林郭勒市| 海南省| 万全县| 城市| 平顺县| 白城市| 石狮市| 盖州市| 法库县|