为什么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中关于链表的遍历相关推荐

  1. c linux time微秒_Linux基础知识(Linux系统、Linux中的链表)

    Linux系统简介 Linux系统的结构及特点 Linux系统的结构图如下图所示: 从上图可以看出,Linux是一个典型的宏内核(一体化内核)结构.硬件系统上面时硬件抽象层,在硬件抽象层上面时内核服务 ...

  2. linux中_Linux基础知识(Linux系统、Linux中的链表)

    Linux系统简介 Linux系统的结构及特点 Linux系统的结构图如下图所示: 从上图可以看出,Linux是一个典型的宏内核(一体化内核)结构.硬件系统上面时硬件抽象层,在硬件抽象层上面时内核服务 ...

  3. linux中链表的使用【转】

    转自:http://blog.csdn.net/finewind/article/details/8074990 Linux下链表的使用方法跟我们常规的不一样,通常情况下,链表的next指针都指向节点 ...

  4. 如何放出Linux内核中的链表大招

    前言 上回,我们说到Linux内核中max()宏的终极奥义,Linux内核链表也不甘示弱,那么接下来,让我们看看Linux内核中的链表大招. 如何放出Linux内核中的链表大招 前言 一.链表简介 ( ...

  5. Linux内核链表交换节点,[笔记]Linux内核链表:结点的插入、删除以及链表的遍历...

    Linux内核链表:结点的插入.删除以及链表的遍历 1. Linux内核链表的核心思想是:在用户自定义的结构A中声明list_head类型的成员p,这样每个结构类型为A的变量a中,都拥有同样的成员p, ...

  6. Linux内核(10) - 内核中的链表

    早上上班坐地铁要排队,到了公司楼下等电梯要排队,中午吃饭要排队,下班了追求一个女孩子也要排队,甚至在网上下载个什么门的短片也要排队,每次看见人群排成一条长龙时,才真正意识到自己是龙的传人.那么下面咱们 ...

  7. 《Linux内核修炼之道》精华分享与讨论(14)——内核中的链表

    早上上班坐地铁要排队,到了公司楼下等电梯要排队,中午吃饭要排队,下班了追求一个女孩子也要排队,甚至在网上下载个什么门的短片也要排队,每次看见人群排成一条长龙时,才真正意识到自己是龙的传人.那么下面咱们 ...

  8. 遍历Linux kernel的链表时删除元素的方法

    内核的链表list_head设计相当巧妙.今天我说一下对list_head链表的遍历时如何删除元素. 链表遍历时,如果删除当前元素,一般都会出错的.在由于语言的各种库中的链表都是如此.list_hea ...

  9. linux中循环删除脚本,shell脚本:遍历删除

    遍历删除文本内路径上文件 windows上测试可以安装Git linux中,准备删除文件的脚本deleteFile.sh,picture.txt保存待删除文件的文件路径,picture文件夹下面有三张 ...

  10. 深入探讨:linux中遍历文件夹下的所有文件

    深入探讨:linux中遍历文件夹下的所有文件 http://www.jb51.net/article/37664.htm

最新文章

  1. 中学计算机课的现状和感受,中小学信息技术课程的现状与发展.doc
  2. String#repeat来到Java吗?
  3. 使用NoSQL实施实体服务–第5部分:使用云提高自治性
  4. navicat远程mysql_navicat 远程连接mysql
  5. 博士笔记 | 周志华《机器学习》手推笔记第二章-模型评估与选择
  6. DIV+CSS如何让文字垂直居中
  7. Java小项目:图片版坦克大战
  8. 工作上不要遮掩,如实回答,什么样的借口可以接受
  9. python模拟超市抹零_Python基础练习二超市存包柜模拟
  10. 压缩文件苹果手机怎么解压「iphone技巧」
  11. 计算机二级报考哪个科目比较好?
  12. python将pascal VOC数据集转成coco数据集
  13. Github访问和下载慢的解决与提升方案
  14. 复合函数求导经典例题_导数--复合函数的导数练习题
  15. WebStrom最新版官网下载包分享
  16. mysql new用法_MySQL触发器之 new 和 old 的理解
  17. 昂瑞微蓝牙芯片HS6620D调试记录
  18. 各大搜索引擎网站登录入口大全
  19. VMware 安装 SOFTICE 问题
  20. mysql 的事件_一文总结MySQL数据库事件--定时任务实现方式

热门文章

  1. idea的黄色感叹号之Spring Configuration Check (Please configura/setup Spring facet for modules)
  2. 浅谈算法和数据结构: 九 平衡查找树之红黑树
  3. 数据库新技术:分布式数据库的体系结构,特点与查询优化(思维导图版总结)
  4. 【状压dp】【POJ2288】Islands and Bridges【Hamilton路】
  5. leetcode 65. Valid Number
  6. 20.有效的括号(力扣leetcode) 博主可答疑该问题
  7. 34.在排序数组中查找元素的第一个和最后一个位置(力扣leetcode) 博主可答疑该问题
  8. celery cluser redis_Celery配置Redis Sentinel做高可用
  9. oracle建表空间、用户
  10. 导弹拦截(数据加强版)