亚洲精品一二区_国产黄色片网站_99久久久成人国产精品_蜜臀网_国产精品一区二区三区免费_成人av中文字幕_91精品国产欧美一区二区成人

當(dāng)前位置:首頁(yè) > 學(xué)習(xí)資源 > 講師博文 > Linux內(nèi)核中的數(shù)據(jù)結(jié)構(gòu)的一點(diǎn)認(rèn)識(shí)

Linux內(nèi)核中的數(shù)據(jù)結(jié)構(gòu)的一點(diǎn)認(rèn)識(shí) 時(shí)間:2018-10-28      來(lái)源:華清遠(yuǎn)見(jiàn)

大家都知道linux內(nèi)核是世界上優(yōu)秀的軟件之一,作為一款優(yōu)秀的軟件,其中的許多的設(shè)計(jì)都精妙之處,十分值得學(xué)習(xí)和借鑒。今天我們就帶大家看一下內(nèi)核中的數(shù)據(jù)結(jié)構(gòu)中一點(diǎn)設(shè)計(jì)。

打開(kāi)內(nèi)核源碼中的 include/linux/list.h頭文件,就可以看到內(nèi)核中聲明的一些與鏈表操作相關(guān)的結(jié)構(gòu)體定義和函數(shù)接口。內(nèi)核中使用更多的是雙向循環(huán)鏈表。我們就看一看內(nèi)核中雙向循環(huán)鏈表的精妙之處吧。

首先看鏈表節(jié)點(diǎn)的結(jié)構(gòu)體的定義:

struct list_head{

struct list_head *next, *prev;

};

大家都可以看到,該結(jié)構(gòu)體的成員僅包含了兩個(gè)指向前和后的兩個(gè)結(jié)構(gòu)體指針,但是在該結(jié)構(gòu)體中卻沒(méi)有數(shù)據(jù)成員,那么到時(shí)候鏈表中沒(méi)有任何數(shù)據(jù),這樣的鏈表有什么用呢?其實(shí)這就是內(nèi)核鏈表設(shè)計(jì)的巧妙之處,因?yàn)樵谡麄(gè)內(nèi)核中需要使用鏈表來(lái)存放的數(shù)據(jù)類(lèi)型太多了,因此如果將內(nèi)核的數(shù)據(jù)結(jié)構(gòu)定義成固定的話,就會(huì)增加大量的結(jié)構(gòu)體類(lèi)型的定義,而內(nèi)核將數(shù)據(jù)成員的定義變的靈活了,就是當(dāng)用到什么樣的數(shù)據(jù)時(shí)就臨時(shí)添加什么數(shù)據(jù),那到底是怎么做的呢?再看下邊的一個(gè)結(jié)構(gòu)體的定義:

struct Data{

int a;

struct list_head p;

};

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

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

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;

//初始化數(shù)據(jù)結(jié)構(gòu)體的值

struct Data data[4] = {0};

int i;

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

{

data[i].a = i + 1;

}

//將數(shù)據(jù)結(jié)構(gòu)體中的list_head類(lèi)型成員頭插入到雙向鏈表中

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

{

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

}

//根據(jù)結(jié)構(gòu)體的一個(gè)成員地址進(jìn)而找到整個(gè)結(jié)構(gòu)體的地址

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藍(lán)牙4.0協(xié)議棧main函數(shù)分析

下一篇:java異常處理機(jī)制原理

戳我查看嵌入式每月就業(yè)風(fēng)云榜

點(diǎn)我了解華清遠(yuǎn)見(jiàn)高校學(xué)霸學(xué)習(xí)秘籍

猜你關(guān)心企業(yè)是如何評(píng)價(jià)華清學(xué)員的

干貨分享
相關(guān)新聞
前臺(tái)專(zhuān)線:010-82525158 企業(yè)培訓(xùn)洽談專(zhuān)線:010-82525379 院校合作洽談專(zhuān)線:010-82525379 Copyright © 2004-2024 北京華清遠(yuǎn)見(jiàn)科技發(fā)展有限公司 版權(quán)所有 ,京ICP備16055225號(hào)-5京公海網(wǎng)安備11010802025203號(hào)

回到頂部

主站蜘蛛池模板: 欧美精品国产第一区二区 | 欧美成人激情 | 亚洲第一网站免费视频 | 国产剧情精品在线 | 国产欧美一区二区精品性色 | 欧美日一区二区三区 | 亚洲精品国产专区91在线 | 欧美影院网站视频观看 | 亚洲va国产日韩欧美精品色婷婷 | 欧美超清videos 1080p | jizz中国18 | 在线观看黄网 | 日韩在线观看一区二区不卡视频 | 欧美最新一区二区三区四区 | 欧美日韩国产手机在线观看视频 | 狠狠色丁香婷婷久久综合2021 | 人人插人| 欧美日韩在线看 | 国产微拍精品 | 欧美日韩亚洲综合 | 成人无遮挡毛片免费看 | 亚洲理论在线 | 狠狠激情五月综合婷婷俺 | 免费黄色软件推荐 | 天天色天天搞 | 激情六月婷婷 | 国产大片免费观看中文字幕 | 久久桃花网 | 中文网丁香综合网 | 欧美日韩一区二区在线观看视频 | 九九视频精品全部免费播放 | 免费a级黄色片 | 日本三级成人午夜视频网 | 人皮交易在线观看高清 | 日本xxxx色视频在线观看免费 | 亚洲黄色小视频 | 国产精品一一在线观看 | 男女性生夜晚视频 | 欧美一区二区三区久久综 | 天天摸日日操 | 蜜臀影院在线观看免费 |