list_entry/list_for_each_entry/list_for_each_entry_safe

24 篇文章 2 订阅
订阅专栏
  • list_entry
#define list_entry(ptr, type, member)  container_of(ptr, type, member)
  1. ptr type member 分别表示 指针 / 包含指针类型的结构体类型 / 指针对应的成员
  2. contain_of的原理:已知type的成员member的地址ptr,计算type的首地址
  3. type的首地址 = ptr – size

在这里插入图片描述

container_of

  1. typeof((type *) 0)->member 获取 member的类型
  2. __mptr = ptr; 定义一个指针变量__mptr, 并将成员变量ptr的地址赋值给它
  3. Offsetof(TYPE, MEMBER) 计算成员member这个成员在type类型结构体中偏移
  4. __mptr – offsetof(type, member) 成员变量的地址减去在结构体中的偏移,就得到了结构体的首地址
  5. 1 和 2本质上并没有干什么事儿,就是定义了一个中间变量,目的是ptr和member如果传入了错误的类型编译器识别warning
#define container_of(ptr, type, member) ({			\
	const typeof(((type *)0)->member) * __mptr = (ptr);	\
	(type *)((char *)__mptr - offsetof(type, member)); })
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)

  • list_for_each_entry
#define list_for_each_entry(pos, head, member) \ 
	for (pos = list_first_entry(head, typeof(*pos), member); \ 
		&pos->member != (head); \ 
		pos = list_next_entry(pos, member))

pos head member分别指宿主结构体类型的指针 宿主结构体使用的链表头
宿主结构体中的链表成员
1.pos定位到第一个宿主结构地址
2.判断不等于链表头
3.取下一个宿主结构

#define list_first_entry(ptr, type, member) \ 
	list_entry((ptr)->next, type, member) 
#define list_next_entry(pos, member) \
	list_entry((pos)->member.next, typeof(*(pos)), member) 

  • list_for_each_entry_safe
#define list_for_each_entry_safe(pos, n, head, member)          \
    for (pos = list_first_entry(head, typeof(*pos), member),    \
        n = list_next_entry(pos, member);           \
         &pos->member != (head);                    \
         pos = n, n = list_next_entry(n, member))

相比list_for_each_entry, list_for_each_entry_safe增加了一个指针n对链表的下一个数据结构进行临时存储,所以在遍历链表的时候如果需要做删除链表的操作,使用list_for_each_entry_safe可以安全的删除,不会影响后续的遍历过程。

9-2 Abstract List Lib.zip_lib/list_debug._list_nodded68x
09-25
自定义抽象链表类,实现STL<list>库中的部分功能。
内核链表点滴--list_for_each_safe使用
zhangge3663的博客
06-19 2371
自己是个初学者,一直在学习国嵌的教程,本来是在本子上做的笔记,今天学习到内核链表了,老师留了个小问题,自己做了一下,算是写下自己的心得吧. 大牛们一定不要见笑... 源程序如下: #include <linux/kernel.h> #include <linux/module.h> #include <linux/init.h> #include <linux/slab.h> #include <linux/list.h> MODULE_LI
list_for_each引起的问题
weixin_30437337的博客
06-30 120
在linux里内核通用列表中list_for_each经常被使用。但这里有一点值得注意,最近在自己项目里就碰到了。 list_for_each的定义如下: #define list_for_each(pos, head) \ for(pos = (head)->next; pos != (head); pos = pos->next) list_del的定义如下: ...
list_for_each_entrylist_for_each_entry_safe
xiaowen_10的专栏
09-19 6210
/**  * list_for_each_entry  -       iterate over list of given type  * @pos:        the type * to use as a loop cursor.  * @head:       the head for your list.  * @member:     the name of the list
在Linux下链表使用介绍三:链表常用接口函数
咸鱼弟的博客
08-12 807
在上一篇我们介绍了内核下链表的基本原理,接下来从应用角度出发介绍常用的接口函数。 1.1container_of /* 原型 */ #define container_of(ptr, type, member) /* 功能 */ 已知某一个成员变量的名字、指针和结构体类型的情况下,计算结构体的指针,也就是计算结构体的起始地址。 /* 参数 */ ptr: 某一个成员的...
linux的内存分配和 list_for_each_entry_safe()函数的介绍
weixin_42177005的博客
01-04 8894
碎碎念 这些内容主要是我翻译国外师傅博客的一小部分内容得来的。不得不说,这个师傅写的文章是真的详细而且亲民。 链接:https://blog.lexfo.fr/cve-2017-11176-linux-kernel-exploitation-part3.html 链接:https://blog.csdn.net/vanbreaker/article/details/7664296 涉及到的一些宏 ...
【Linux内核】内核常用链表宏解释
逆风水手的博客
05-08 2681
这段代码是一个宏定义,用于遍历一个链表中所有的元素,并且在遍历过程中可以安全地删除元素。具体来说,这个宏定义的功能是:遍历链表中所有的元素,从头节点开始,直到尾节点结束。对于每个元素,使用给定的结构体成员变量名找到它所属的结构体对象,并且将该对象的指针赋值给给定的变量名。在遍历过程中,可以安全地删除当前元素,因为它在删除前会先保存下一个元素的指针,保证不会影响遍历的正确性。
list_for_each,list_for_each_entrylist_for_each_entry_safe
Wang20122013的博客
01-07 2534
比较 共同点 1.list_for_each和list_for_each_entry都是遍历链表的两个宏,本质上都是for循环。 2.他们做的事情本质上都一样,A.获取链表头,B.判断链表项是不是链表头,C.指向链表的下一项。 3.他们的区别:list_for_each遍历的链表,其链表项不属于某个结构体。或者说不关心它是不是包含在某个结构体中。 区别 1.list_for_each_entry遍历的链表,其每一项都是某个结构体中的成员,单纯遍历链表还不行,还要找到包含这个链表项的结构体的地址,从而为下一
linux 内核链表遍历宏 list_for_each_entry list_for_each_entry_safe
热门推荐
whatday的专栏
09-04 1万+
看内核代码都会发现,内核链表的操作常用的二个宏list_for_each_entrylist_for_each_entry_safe 循序渐进,先从最底层的函数container_of 函数说起,其内核定义如下: 先看offsetof宏,根据优先级的顺序,最里面的小括号优先级最高, TYPE *将整型常量0强制转换为TYPE型的指针,且这个指针指向的地址为0, 也就是将地址0开始的一块...
Linux内核list&hlist;解读
04-04
目录 1. 前言 2 2. 通用宏 2 2.1. typeof 2 2.1.1. 定义 3 2.1.2. 用途 3 2.1.3. 示例 3 2.2. offset_of 3 2.2.1. 定义 3 2.2.2. 作用 3 2.2.3. 原理 3 2.2.4. 示例 3 2.3. container_of 4 2.3.1. 定义 4 2.3.2. 作用 4 2.3.3. 示例 4 2.4. prefetch 4 2.4.1. 定义 4 2.4.2. 作用 4 3. list 5 3.1. list结构 5 3.1.1. 定义 5 3.1.2. 作用 5 3.1.3. 解读 5 3.1.4. 示例 5 3.2. 遍历方向 6 3.3. list_entry 6 3.3.1. 定义 6 3.3.2. 作用 7 3.4. list_for_each 7 3.4.1. 定义 7 3.4.2. 作用 7 3.4.3. 示例 7 3.5. __list_for_each 8 3.5.1. 定义 8 3.5.2. 作用 8 3.6. list_for_each_prev 8 3.6.1. 定义 8 3.6.2. 作用 8 3.7. list_for_each_safe 8 3.7.1. 定义 8 3.7.2. 作用 9 3.7.3. 区别 9 3.7.4. 示例 9 3.8. list_for_each_entry 9 3.8.1. 定义 9 3.8.2. 作用 10 3.8.3. 区别 10 3.8.4. 完整示例 10 3.9. list_for_each_entry_safe 12 3.9.1. 定义 12 3.9.2. 作用 13 3.10. list_for_each_entry_reverse 13 3.10.1. 定义 13 3.10.2. 作用 13 3.11. list_for_each_entry_continue 13 3.11.1. 定义 13 3.11.2. 作用 13 3.11.3. 区别 13 3.12. list_for_each_safe_rcu 14 4. hlist(hash list) 14 4.1. hlist(hash list)结构 14 4.1.1. 简述 14 4.1.2. 定义 14
AttributeList.rar_Linux/Unix编程_Unix_Linux_
08-11
Interface for an element s attribute specifications Source Code for Embedded Linux.
javalist.zip_list集合 java
09-23
java中集合list的应用非常重要啊!
OICQ的LIST.rar_list_visual c
09-19
像ociq的好友界面的控件。
IE.rar_IE_delphi list
09-23
delphi 写的获取IE历史记录列表的函数
双链表小试牛刀-模块代码-源码list_for_each有bug需要do-while缓解尴尬
GKoSon的博客
10-10 154
#include "gbaselist.h" static uint8_t SoncetimerTaskId = 0; //表示每个节点的标号 可以统计个数 以及 根据ID查找以小博大 static node_oncetime_type *Soncetimerhead = NULL; //链表的头结点 //遍历链表 周期loop执行 void on...
[转载] 终于理解list_entrylist_for_each_entry
FUNKUNUX
07-27 9779
原文地址:http://blog.sina.com.cn/s/blog_533074eb0101do71.html 内核中经常采用链表来管理对象,先看一下内核中对链表的定义     struct list_head {         struct list_head *next, *prev;     };       一般将该数据结构嵌入到其他的数据结构中,从而使得内核
LIST_ENTRY链表学习
ShadowAssassin的专栏
08-22 6202
链表是驱动开发中经常遇到的一个数据结构,主要是双向循环链表;要使用链表,需要用到一个LIST_ENTRY的结构,其定义如下: typedef struct _LIST_ENTRY { struct _LIST_ENTRY *Flink; // 指向下一个节点 struct _LIST_ENTRY *Blink; // 指向前一个节点 } LIST_ENTR
内核双链表篇:list.h——遍历链表:list_for_each、list_for_each_safe、list_for_each_entry
weixin_42645653的博客
08-27 1124
遍历双链表,不适合与遍历中进行删除节点的操作。遍历链表,相较于多增加了一个中间参数,保存当前结点的下个结点,避免当前结点删除后找不到下个结点。
list_for_each_entry_safe代码解读
最新发布
11-10
list_for_each_entry_safe是Linux内核中的一个宏,用于遍历双向链表。它与list_for_each_entry的区别在于,它增加了一个指针n对链表的下一个数据结构进行临时存储,所以在遍历链表的时候如果需要做删除链表的操作,使用list_for_each_entry_safe可以安全的删除,不会影响后续的遍历过程。 下面是一个list_for_each_entry_safe的示例代码: ```c struct list_head *pos, *n; struct my_struct *entry; list_for_each_entry_safe(entry, pos, n, &my_list) { // 对entry进行操作 // ... // 删除entry list_del(&entry->list); // ... } ``` 在上面的代码中,my_list是一个双向链表,entry是链表中的一个元素,包含一个名为list的list_head结构体,用于连接链表。pos和n是两个指向list_head结构体的指针,用于遍历链表。在遍历链表的过程中,如果需要删除链表中的元素,可以使用list_del函数,它会将元素从链表中删除,并将元素的list_head结构体的指针置为NULL,这样就不会影响后续的遍历过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • C/C++ 代码检测工具 8208
  • 运动控制:运动模式理解 6101
  • Linux下interface文件修改 5177
  • 父类指针指向子类对象的理解 4934
  • C++虚函数 - 静态函数能否为虚函数 . 4595

分类专栏

  • linux操作系统 24篇
  • linux杂项 3篇
  • linux编程 10篇
  • linux设备驱动 10篇
  • 投资 2篇
  • C++ 13篇
  • linux编译移植 6篇
  • 硬件 8篇
  • 思考 4篇
  • SQL 1篇
  • 运动控制 7篇
  • 网络 1篇
  • GCC 7篇
  • 互联网 1篇
  • ARM 2篇

最新评论

  • 中断软硬件流程

    该账号已不用···: 这个图是在哪本书上的啊

  • python object类

    Acrab_Chogori: 答主写的很好,但是对于一个不懂object的人,您说的其他的也看不懂表情包

  • GCC:fmessage-length

    ctotalk: 学习

  • volatile问题的深入

    不吃西红柿丶: 很不错分享~ 进步的路上一起努力!期待您的关注哈。

  • 运动控制:CanOpen相关移植

    ctotalk: 学习

您愿意向朋友推荐“博客详情页”吗?

  • 强烈不推荐
  • 不推荐
  • 一般般
  • 推荐
  • 强烈推荐
提交

最新文章

  • cpuset流程
  • 列出某一CPU上跑的所有进程/线程
  • kernel module静态加载与动态加载区别
2022年13篇
2021年32篇
2020年46篇
2019年32篇
2018年11篇
2017年61篇
2016年4篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

深圳SEO优化公司和县网站关键词优化推荐松原网站优化价格随州百度网站优化哪家好诸城SEO按效果付费报价坂田建站苏州网站推广系统哪家好秦皇岛优化公司梅州阿里店铺运营多少钱保山网站优化按天收费绍兴百度seo推荐西宁关键词按天扣费推荐莱芜网站搭建多少钱玉树优秀网站设计哪家好茂名百度seo玉树网页制作公司松岗网页设计推荐九江建设网站公司邢台百姓网标王推广公司甘南百度seo价格松原网站优化按天扣费报价坪山百度竞价报价新乡网站设计哪家好辽阳阿里店铺托管报价玉林百度seo价格商丘网站推广系统价格霍邱设计网站价格坪地建站哪家好焦作企业网站制作海东网站建设设计价格长沙网站推广报价歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

深圳SEO优化公司 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化