色yeye在线视频观看_亚洲人亚洲精品成人网站_一级毛片免费播放_91精品一区二区中文字幕_一区二区三区日本视频_成人性生交大免费看

當前位置:首頁 > 嵌入式培訓 > 嵌入式學習 > 講師博文 > Linux內核中的數據結構的一點認識

Linux內核中的數據結構的一點認識 時間:2018-09-25      來源:未知

大家都知道linux內核是世界上優秀的軟件之一,作為一款優秀的軟件,其中的許多的設計都精妙之處,十分值得學習和借鑒。今天我們就帶大家看一下內核中的數據結構中一點設計。

打開內核源碼中的 include/linux/list.h頭文件,就可以看到內核中聲明的一些與鏈表操作相關的結構體定義和函數接口。內核中使用更多的是雙向循環鏈表。我們就看一看內核中雙向循環鏈表的精妙之處吧。

首先看鏈表節點的結構體的定義:

struct list_head{

struct list_head *next, *prev;

};

大家都可以看到,該結構體的成員僅包含了兩個指向前和后的兩個結構體指針,但是在該結構體中卻沒有數據成員,那么到時候鏈表中沒有任何數據,這樣的鏈表有什么用呢?其實這就是內核鏈表設計的巧妙之處,因為在整個內核中需要使用鏈表來存放的數據類型太多了,因此如果將內核的數據結構定義成固定的話,就會增加大量的結構體類型的定義,而內核將數據成員的定義變的靈活了,就是當用到什么樣的數據時就臨時添加什么數據,那到底是怎么做的呢?再看下邊的一個結構體的定義:

struct Data{

int a;

struct list_head p;

};

其中成員a是我們的數據,而鏈表節點的變量變成了我們新結構體類型的成員。這樣定義的話,只需要將其中的成員p添加到一個雙向循環鏈表中,通過成員p我們就可以得到我們的數據成員a。可以這樣比喻,就是成員p就是一個晾衣架,有很多晾衣架都掛在一個晾衣桿上,但是每個晾衣架上掛什么衣服就比較隨便了。只要我們找到一個晾衣架就可以立刻得到掛在上邊的衣服了。

下邊提供一個示例代碼,闡釋一下這中用法:

struct list_head{

struct list_head *next, *prev;

};

/* data struct */

struct Data{

int a;

struct list_head p;

};

#define LIST_HEAD_INIT(name) { &(name), &(name) }

#define LIST_HEAD(name) \

struct list_head name = LIST_HEAD_INIT(name)

#define mycontainer_of(memadd, type, memname) \

((struct type*)(((char*)memadd - ((unsigned long)&(((struct type*)0)->memname)))))

void INIT_LIST_HEAD(struct list_head *list)

{

list->next = list;

list->prev = list;

}

void __list_add(struct list_head *new, struct list_head *prev, struct list_head *next)

{

next->prev = new;

new->next = next;

new->prev = prev;

prev->next = new;

}

void list_add(struct list_head *new, struct list_head *head)

{

__list_add(new, head, head->next);

}

int main(void)

{

//初始化雙向鏈表頭

struct list_head *head = malloc(sizeof(struct list_head));

INIT_LIST_HEAD(head);

struct list_head *q;

//初始化數據結構體的值

struct Data data[4] = {0};

int i;

for ( i = 0; i < 4; i++)

{

data[i].a = i + 1;

}

//將數據結構體中的list_head類型成員頭插入到雙向鏈表中

for(i = 0; i < 4; i++)

{

list_add(&(data[i].p), head);

}

//根據結構體的一個成員地址進而找到整個結構體的地址

for (q = head->next; q != head; q = q->next )

{

struct Data *temp;

temp = mycontainer_of(q, Data, p);

printf("%d\n", temp->a);

}

return 0;

}

上一篇:TI藍牙4.0協議棧main函數分析

下一篇:Linux 下搭建Apache 服務器

熱點文章推薦
華清學員就業榜單
高薪學員經驗分享
熱點新聞推薦
前臺專線:010-82525158 企業培訓洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,京ICP備16055225號-5京公海網安備11010802025203號

回到頂部

主站蜘蛛池模板: 7788.毛片| 国产欧美久久一区二区 | 久久99亚洲含羞草影院 | 天天干天天爽天天射 | 无码人妻精品专区在线视频 | 国产激情大臿免费视频 | 国产成人精品日本亚洲语音 | 亚洲欧美激情网站 | 精品无码一区二区三区爱欲九九 | 老司机精品视频一区二区 | 女人爽到高潮嗷嗷叫视频 | 丰满人妻熟妇乱又伦精品劲 | 久久婷婷国产综合精品 | 日本色片视频 | a片疯狂做爰全过的视频 | 天天爽夜夜爽人人爽从早干到睌 | 奇米四色7777中文字幕 | 亚洲高清国产拍精品影院 | 久久国产精品嫩草影院介绍 | 天堂AV无码大芭蕉伊人AV孕妇 | 欧美成人精品第一区 | 久久人妻无码一区二区 | 色综合久久久无码网中文 | 大地影院mv高清在线观看免费 | 高清偷自拍亚洲精品三区 | 无码国产色欲XXXX视频 | 天堂中文8资源在线8 | 成品网站w灬源码三叶草 | 少妇愉情理伦片 | 成人免费播放视频777777 | 免费A级毛片无码免费视 | 国产成人A人亚洲精品无码 日本免费a∨片免费 | 中国护士xxxx裸体xxxx | 精品国产综合成人亚洲区2022 | 国产又色又爽又黄的 | 人妻内射AV六九无码一零八零P | 新香蕉少妇视频网站 | 成人影片麻豆国产影片免费观看 | 中文字幕第15页 | 日日网站 | 免费黄色网址在线观看 |