看内核代码都会发现,内核链表的操作常用的二个宏list_for_each_entry和list_for_each_entry_safe 循序渐进,先从最底层的函数container_of函数说起,其内核定义如下: 先看offsetof宏,根据优先级的顺序,最里面的小括号优先级最高,TYPE *将整型常量0强制转换为TYPE型的指针,且这个指针指向的地址为0,也就是将地址0开...
list_for_each_entry_safe宏是list_for_each_entry宏的变种,它与list_for_each_entry宏完全相同,只是多了一个参数n,用来保存pos参数指向的下一个节点,使得在遍历期间可以安全地修改链表。 以下为list_for_each_entry_safe函数的示例程序,该程序用于将一个链表中的元素都复制到另一个链表中: ...
一、list_for_each_entry_safe基本用法 list_for_each_entry_safe数由C言中的宏定义构成,它有三个参数:pos,n,head。其中,head指向头节点的指针,pos n指向遍历节点的指针,每次循环时,pos是指向当前节点,而n是指向下一个要遍历的节点。 list_for_each_entry_safe数的典型用法如下: struct list_head *head;tt...
list_for_each_entry_safe原理 `list_for_each_entry_safe`是Linux内核源码中双向链表的遍历函数,用于遍历链表中的元素。它的原型定义如下: ```c #define list_for_each_entry_safe(pos, n, head, member) \ for (pos = list_entry((head)->next, typeof(*pos), member), \...
2,注意事项(对释放锁的控制,以及锁超时的控制)random_value 要保证唯一,可以用 trace_id 来保证!
#define list_for_each_entry_safe(pos, n, head, member) ``` 其中,pos是当前遍历的节点的指针,n是下一个节点的指针,head是双链表的头节点指针,member是节点中的list_head成员变量。 它的使用方法如下所示: ```c // 对pos进行操作 // 删除pos节点 kfree(pos); ``` 在这个例子中,我们可以在遍历过...
然后介绍list_add,通过改变链表位置的问题引出list_for_each函数,然后为了获取容器结构地址,引出offsetof和container_of宏,并对内核链表设计原因作出了解释,一步步引导到list_for_each_entry,然后介绍list_del函数,通过在遍历时list_del链表的不安全行为,引出list_for_each_entry_safe函数,通过本文,我希望读者可以得到...
Linux代码看的比较多了,经常会遇到container_of和list_for_each_entry,特别是list_for_each_entry比较多,因为Linux经常用到链表,虽然知道这些函数的大概意思,但一旦出现一个类似的函数比如list_for_each_entry_safe就又会感到头大,所以下定决心分析总结一下这些函数的用法,以后再看到这些面孔的时候也会轻松很多,读Li...
los_dl_list_for_each_entry_safe(pos, n, head, member) { // pos:当前节点指针 // n:下一个节点指针 // head:链表头指针 // member:链表节点在结构体中的成员名 //在这里进行节点的操作,比如打印节点信息、删除节点等 } ``` 其中,pos表示当前遍历到的节点指针,n表示下一个节点指针,head表示链表头...
* Insert a new entry between two known consecutive entries. * * This is only for internal list manipulation where we know * the prev/next entries already! */ static inline void __list_add(struct list_head *new, struct list_head *prev, ...