* @member: the name of the list_struct within the struct.*/#definelist_for_each_entry(pos, head, member) \for(pos = list_entry((head)->next,typeof(*pos), member); \&pos->member !=(head); \ pos= list_entry(pos->member.next,typeof(*pos), member)) 将for循环分解为一下三点:...
而list_add_tail函数则以new、head->prev、head为参数调用__list_add,将new结点插入到head->prev和head之间,也就是将new结点插入到特定的已知结点head的前面。 有了list_add和list_add_tail,我们可以很方便地实现栈(list_add)和队列(list_add_tail),在本文的最后一节,我们再做详细的分析。 ② 删除:list_de...
Linux代码看的比较多了,经常会遇到container_of和list_for_each_entry,特别是 list_for_each_entry比较多,因为Linux经常用到链表,虽然知道这些函数的大概意思,但一旦出现一个类似的函数比如 list_for_each_entry_safe就又会感到头大,所以下定决心分析总结一下这些函数的用法,以后再看到这些面孔的时候也会轻松很多,...
Linux代码看的比较多了,经常会遇到container_of和list_for_each_entry,特别是 list_for_each_entry比较多,因为Linux经常用到链表,虽然知道这些函数的大概意思,但一旦出现一个类似的函数比如 list_for_each_entry_safe就又会感到头大,所以下定决心分析总结一下这些函数的用法,以后再看到这些面孔的时候也会轻松很多,...
Linux代码看的比较多了,经常会遇到container_of和list_for_each_entry,特别是list_for_each_entry比较多,因为Linux经常用到链表,虽然知道这些函数的大概意思,但一旦出现一个类似的函数比如list_for_each_entry_safe就又会感到头大,所以下定决心分析总结一下这些函数的用法,以后再看到这些面孔的时候也会轻松很多,读Li...
1>function:这个函数是如果pos非空,那么pos的值就为其本身,如果pos为空,那么就从链表头强制扩展一个虚pos指针,这个宏定义是为了在list_for_entry...list_for_each_entry_safe中用于临时存储post的下一个指针 member: 该数据项类型定义中list_head成员的变量名 六.内核链表的应用 分析了内核链表就要对其进行...
在这里,list_for_each_entry就是一个for循环: for(pos = list_entry((head)->next, typeof(*pos), member);prefetch(pos->member.next), &pos->member !=(head);pos= list_entry(pos->member.next, typeof(*pos), member)) 1) pos = list_entry((head)->next, typeof(*pos), member) ...
1.list_for_each和list_for_each_entry都是遍历链表的两个宏,本质上都是for循环。 2.他们做的事情本质上都一样,A.获取链表头,B.判断链表项是不是链表头,C.指向链表的下一项。 3.他们的区别:list_for_each遍历的链表,其链表项不属于某个结构体。或者说不关心它是不是包含在某个结构体中。