Linux中关于链表的遍历
为什么80%的码农都做不了架构师?>>>
Linux中反链表的操作是用的比较多的,其中include/linux/list.h是一个很关键的文件,
下面记录几个很重要的链表操作宏:
list_for_each_entry(pos, head, member)
作用: 循环遍历每个pos实例中的member成员,在大多数情况下member成员是一个链表节点(list_head node)
实现:
#define list_for_each_entry(pos, head, member) \
for(pos = list_entry((head)->next, typeof(*pos),member); \
( 注:获取包含 head->next 节点的pos实例,其中head->next在pos结构中的名称为member)
prefetch(pos->member.next), &pos->member != (head); \
(注:prefetch为预取处理, pos->member!==head表示head搜索完毕)
pos = list_entry(pos->member.next, typeof(*pos), member))
(注: 下一次循环,取当前pos实例的成员member节点的下一个节点的pos实例)
读起来有点像绕口令,其中两次用到了list_entry, 其原型如下:
#define list_entry(ptr, type, member) \
container_of(ptr, type, member)
实际情况就是这样;
其实list_for_each_entry就是遍历链表(list_head)的每个节点,返回每个节点所在的数据结构实例,另外还有一个宏,
名为list_for_each,同样遍历链表(list_head)每个节点,只返回节点的地址。
另外,再次提到了container_of宏,该宏定义在include/linux/kernel.h中,是一个使用频率超高的宏,内容为:
#define container_of(ptr, type, member) ({
const typeof( ((type*) 0)->member) * __mptr = (ptr); \
(type *) ( (char *) __mptr - offsetof(type, member) ) ;})
其中, offset(type,member)求得member在type中的字节偏移数, 此时__mptr是实际的member地址,
让__mptr地址回退若干个字节偏移数,就得到了type实例的地址。
转载于:https://my.oschina.net/armsky/blog/37790
Linux中关于链表的遍历相关推荐
- c linux time微秒_Linux基础知识(Linux系统、Linux中的链表)
Linux系统简介 Linux系统的结构及特点 Linux系统的结构图如下图所示: 从上图可以看出,Linux是一个典型的宏内核(一体化内核)结构.硬件系统上面时硬件抽象层,在硬件抽象层上面时内核服务 ...
- linux中_Linux基础知识(Linux系统、Linux中的链表)
Linux系统简介 Linux系统的结构及特点 Linux系统的结构图如下图所示: 从上图可以看出,Linux是一个典型的宏内核(一体化内核)结构.硬件系统上面时硬件抽象层,在硬件抽象层上面时内核服务 ...
- linux中链表的使用【转】
转自:http://blog.csdn.net/finewind/article/details/8074990 Linux下链表的使用方法跟我们常规的不一样,通常情况下,链表的next指针都指向节点 ...
- 如何放出Linux内核中的链表大招
前言 上回,我们说到Linux内核中max()宏的终极奥义,Linux内核链表也不甘示弱,那么接下来,让我们看看Linux内核中的链表大招. 如何放出Linux内核中的链表大招 前言 一.链表简介 ( ...
- Linux内核链表交换节点,[笔记]Linux内核链表:结点的插入、删除以及链表的遍历...
Linux内核链表:结点的插入.删除以及链表的遍历 1. Linux内核链表的核心思想是:在用户自定义的结构A中声明list_head类型的成员p,这样每个结构类型为A的变量a中,都拥有同样的成员p, ...
- Linux内核(10) - 内核中的链表
早上上班坐地铁要排队,到了公司楼下等电梯要排队,中午吃饭要排队,下班了追求一个女孩子也要排队,甚至在网上下载个什么门的短片也要排队,每次看见人群排成一条长龙时,才真正意识到自己是龙的传人.那么下面咱们 ...
- 《Linux内核修炼之道》精华分享与讨论(14)——内核中的链表
早上上班坐地铁要排队,到了公司楼下等电梯要排队,中午吃饭要排队,下班了追求一个女孩子也要排队,甚至在网上下载个什么门的短片也要排队,每次看见人群排成一条长龙时,才真正意识到自己是龙的传人.那么下面咱们 ...
- 遍历Linux kernel的链表时删除元素的方法
内核的链表list_head设计相当巧妙.今天我说一下对list_head链表的遍历时如何删除元素. 链表遍历时,如果删除当前元素,一般都会出错的.在由于语言的各种库中的链表都是如此.list_hea ...
- linux中循环删除脚本,shell脚本:遍历删除
遍历删除文本内路径上文件 windows上测试可以安装Git linux中,准备删除文件的脚本deleteFile.sh,picture.txt保存待删除文件的文件路径,picture文件夹下面有三张 ...
- 深入探讨:linux中遍历文件夹下的所有文件
深入探讨:linux中遍历文件夹下的所有文件 http://www.jb51.net/article/37664.htm
最新文章
- 中学计算机课的现状和感受,中小学信息技术课程的现状与发展.doc
- String#repeat来到Java吗?
- 使用NoSQL实施实体服务–第5部分:使用云提高自治性
- navicat远程mysql_navicat 远程连接mysql
- 博士笔记 | 周志华《机器学习》手推笔记第二章-模型评估与选择
- DIV+CSS如何让文字垂直居中
- Java小项目:图片版坦克大战
- 工作上不要遮掩,如实回答,什么样的借口可以接受
- python模拟超市抹零_Python基础练习二超市存包柜模拟
- 压缩文件苹果手机怎么解压「iphone技巧」
- 计算机二级报考哪个科目比较好?
- python将pascal VOC数据集转成coco数据集
- Github访问和下载慢的解决与提升方案
- 复合函数求导经典例题_导数--复合函数的导数练习题
- WebStrom最新版官网下载包分享
- mysql new用法_MySQL触发器之 new 和 old 的理解
- 昂瑞微蓝牙芯片HS6620D调试记录
- 各大搜索引擎网站登录入口大全
- VMware 安装 SOFTICE 问题
- mysql 的事件_一文总结MySQL数据库事件--定时任务实现方式
热门文章
- idea的黄色感叹号之Spring Configuration Check (Please configura/setup Spring facet for modules)
- 浅谈算法和数据结构: 九 平衡查找树之红黑树
- 数据库新技术:分布式数据库的体系结构,特点与查询优化(思维导图版总结)
- 【状压dp】【POJ2288】Islands and Bridges【Hamilton路】
- leetcode 65. Valid Number
- 20.有效的括号(力扣leetcode) 博主可答疑该问题
- 34.在排序数组中查找元素的第一个和最后一个位置(力扣leetcode) 博主可答疑该问题
- celery cluser redis_Celery配置Redis Sentinel做高可用
- oracle建表空间、用户
- 导弹拦截(数据加强版)