作者:百色金融新闻网日期:
返回目录:财经要闻
最新资讯《深入浅出分析Linux内核链表(图解)-结构图》主要内容是结构图,前戏本文我们来讲讲内核链表,很久之前当我第一次看到内核通用链表的时候,我被精简的代码,巧妙的思路惊呆了。,现在请大家看具体新闻资讯。
前戏
本文我们来讲讲内核链表,很久之前当我第一次看到内核通用链表的时候,我被精简的代码,巧妙的思路惊呆了。人世间还有此等巧妙之物(原谅我的夸张),只有前驱和后继指针,而没有数据域(当时觉得很奇怪)。内核通用链表,在linux源代码下include/Lish.h下,具备通用性,使用非常方便。只需要在结构定义一个链表结构就可以使用。好了,我们好好的了解下吧。
常用链表介绍
我们都知道链表是最基础的数据结构,通常可以分为,单链表,双链表;还可以分为单向链表和循环链表。通常我们的链表定义是这样子的:
链表节点中包含数据域(data)和指针域(next)。链表通常包含一个头结点,不存放数据,方便链表操作。单向的链表结构如下图:
双向循环链表结构如下图所示:
这样数据域和指针域在一起的结构为什么不好?其实这样结构降低了链表的通用性了,扩展性太差,按照上图例子,只能存储的是特定的数据类型。
内核通用链表
那我们看看内核链表是怎么做的。首先我们看下结构定义如下图:
看个直观的图:
那怎么使用这个链表呢?
只需要在结构体中定义一个链表类型(一定要放在最下方)的数据即可。例如定义一个data_info链表:
定义一个data_info链表,data_info data_info_list;
通过data_info_head进行链表操作。通过container_of和offsetof,可以根据data_info_head的地址找出data_info的起始地址。为了方便大家理解,下图展示了链表的整体结构图
好了,本文就到这里,感谢大家的支持,我们下期见!