list_entry((head)->next, typeof(*pos), member)返回(head)->next物理指针所处位置向前减去offsetof()个字节数据之后, 其父变量pos的物理地址,父变量的类型在编译时由typeof(*pos)自动返回.所以list_for_each_entry遍历head 下面挂接的类型为typeof(*pos)的childs结构体们,当然每个child结构体包含struct list...
pos= list_entry(pos->member.next,typeof(*pos), member)) 将for循环分解为一下三点: 1. for循环初始化 pos = list_entry((head)->next, typeof(*pos), member); 2. for循环执行条件 &pos->member != (head); 3. 每循环一次执行 pos = list_entry(pos->member.next, typeof(*pos), member...
我们知道list_for_each_entry会用到list_entry,而list_entry用到container_of,所以首先讲讲container_of。 在讲container_of之前我们不得不提到offsetof,因为在container_of中会使用到它,所以我们看下来,把list_for_each_entry函数的用法理顺我们对整个Linux中经常用到的一些函数就会比较清楚了。 offsetof/**/ #defin...
= (head); \ pos = n, n = list_entry(n->member.next, typeof(*n), member)) 相比于list_for_each_entry,list_for_each_entry_safe用指针n对链表的对下一个数据结构进行了临时存储,所以如果在遍历链表的时候可能要删除链表的当前项,用list_for_each_entry_safe可以安全的删除,而不会影响接下来的...
Linux代码看的比较多了,经常会遇到container_of和list_for_each_entry,特别是list_for_each_entry比较多,因为Linux经常用到链表,虽然知道这些函数的大概意思,但一旦出现一个类似的函数比如list_for_each_entry_safe就又会感到头大,所以下定决心分析总结一下这些函数的用法,以后再看到这些面孔的时候也会轻松很多,读Li...
Linux代码看的比较多了,经常会遇到container_of和list_for_each_entry,特别是 list_for_each_entry比较多,因为Linux经常用到链表,虽然知道这些函数的大概意思,但一旦出现一个类似的函数比如 list_for_each_entry_safe就又会感到头大,所以下定决心分析总结一下这些函数的用法,以后再看到这些面孔的时候也会轻松很多,...
转载自linux之list_for_each和list_for_each_entry函数 - 裸睡的猪 - 博客园 (cnblogs.com) 比较: 1.list_for_each和list_for_each_entry都是遍历链表的两个宏,本质上都是for循环。 2.他们做的事情本质上都一样,A.获取链表头,B.判断链表项是不是链表头,C.指向链表的下一项。