数据结构开发(10):Linux内核链表】的更多相关文章

0.目录 1.老生常谈的两个宏(Linux) 1.1 offsetof 1.2 container_of 2.Linux内核链表剖析 3.小结 1.老生常谈的两个宏(Linux) Linux 内核中常用的两个宏定义: 1.1 offsetof 见招拆招--第一式:编译器做了什么? offsetof 用于计算 TYPE 结构体中 MEMBER 成员的偏移位置. 编译器清楚的知道结构体成员变量的偏移位置 通过结构体变量首地址与偏移量定位成员变量 示例--offsetof: #include <std…
0. 概述 学习使用一下 linux 内核链表,在实际开发中我们可以高效的使用该链表帮我们做点事, 链表是Linux 内核中常用的最普通的内建数据结构,链表是一种存放和操作可变数据元 素(常称为节点)的数据结构,链表和静态的数组不同之处在于,它所包含的元素都是动 态创建插入链表的,在编译时不必知道具体需要创建多少个元素.   另外也因为链表中 每个元素的创建时间各不相同,所以它们在内存中无须占用连续内存区,正是因为元素 不连续存放,所以各元素需要通过某种方式被连接在一起,于是每个元素都包含一个指…
转自:http://blog.csdn.net/BoArmy/article/details/8652776 1.内核链表和普通链表的区别 内核链表是一个双向链表,但是与普通的双向链表又有所区别.内核链表中的链表元素不与特定类型相关,具有通用性. 我们先来看一幅图 链表数据结构的定义 structlist_head { struct list_head *next, *prev; } 初始化链表头 INIT_LIST_HEAD(list_head*head) 插入节点 list_add(stru…
Linux 内核链表 list.h 的使用 C 语言本身并不自带集合(Collection)工具,当我们需要把结构体(struct)实例串联起来时,就需要在结构体内声明指向下一实例的指针,构成所谓的"链表".而为了实现对链表的操作,我们需要另外实现一系列的函数,例如添加.删除.搜索.复制等等.而利用 Kernel 源代码中自带的 list.h,则可以方便地实现任意类型结构体的串联. 编程需求 假设我有一个表示学生资料的结构体: #define MAX_STRING_LENGTH 50…
链表数据结构的定义非常简洁: struct list_head { struct list_head *next, *prev; }; list_head结构包括两个指向list_head结构的指针prev和next.该内核链表具备双链表功能.通常它都组织成双循环链表,这里的list_head没有数据域.在Linux内核链表中,不是在链表结构中包括数据,而是在数据结构中包括链表节点.以下是一个简单的内核模块的样例.包括了对链表进行插入.删除.遍历的一些函数: list.c: #include <…
本文从最基本的内核链表出发,引出初始化INIT_LIST_HEAD函数,然后介绍list_add,通过改变链表位置的问题引出list_for_each函数,然后为了获取容器结构地址,引出offsetof和container_of宏,并对内核链表设计原因作出了解释,一步步引导到list_for_each_entry,然后介绍list_del函数,通过在遍历时list_del链表的不安全行为,引出list_for_each_entry_safe函数,通过本文,我希望读者可以得到如下三个技能点: 1.…
引用地址:http://www.ibm.com/developerworks/cn/linux/kernel/l-chain/index.html 一. 链表数据结构简介 链表是一种常用的组织有序数据的数据结构,它通过指针将一系列数据节点连接成一条数据链,是线性表的一种重要实现方式.相对于数组,链表具有更好的动态性,建立链表时无需预先知道数据总量,可以随机分配空间,可以高效地在链表中的任意位置实时插入或删除数据.链表的开销主要是访问的顺序性和组织链的空间损失. 通常链表数据结构至少应包含两个域:…
一.常用的链表和内核链表的区别 1.1  常规链表结构        通常链表数据结构至少应包含两个域:数据域和指针域,数据域用于存储数据,指针域用于建立与下一个节点的联系.按照指针域的组织以及各个节点之间的联系形式,链表又可以分为单链表.双链表.循环链表等多种类型,下面分别给出这几类常见链表类型的示意图: 单链表: 双链表: 1.2  Linux 2.6内核链表数据结构        链表数据结构的定义很简单(节选自[include/linux/list.h],以下所有代码,除非加以说明,其余…
转载:http://www.ibm.com/developerworks/cn/linux/kernel/l-chain/   一. 链表数据结构简介 链表是一种常用的组织有序数据的数据结构,它通过指针将一系列数据节点连接成一条数据链,是线性表的一种重要实现方式.相对于数组,链表具有更好的动态性,建立链表时无需预先知道数据总量,可以随机分配空间,可以高效地在链表中的任意位置实时插入或删除数据.链表的开销主要是访问的顺序性和组织链的空间损失. 通常链表数据结构至少应包含两个域:数据域和指针域,数据…
第零章:扯扯淡 出一个有意思的题目:用一个宏定义FIND求一个结构体struct里某个变量相对struc的编移量,如 struct student { int a; //FIND(struct student,a) 等于0 char b; //FIND(struct student,b)等于4 double c; }; 参考答案:#define FIND(type,member) ((size_t)&((type*)0)->member) 我这样理解(可能不太正确): (type*)0,0在…