看内核代码都会发现,内核链表的操作常用的二个宏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_safe`是Linux内核源码中双向链表的遍历函数,用于遍历链表中的元素。它的原型定义如下: ```c #define list_for_each_entry_safe(pos, n, head, member) \ for (pos = list_entry((head)->next, typeof(*pos), member), \...
list_for_each_entry()宏,从给定的一个链表中遍历每一个元素,设置了一个循环控制参数pos,以指向每一个元素,该参数被初始化为head参数所指向的member成员,每次循环中,pos参数会被更新为member成员的下一个元素,当head参数中member成员指向自己时,也就是链表中不再有其他元素时,遍历结束。 list_for_each_entry_s...
一、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...
#define list_for_each_entry_safe(pos, n, head, member) ``` 其中,pos是当前遍历的节点的指针,n是下一个节点的指针,head是双链表的头节点指针,member是节点中的list_head成员变量。 它的使用方法如下所示: ```c // 对pos进行操作 // 删除pos节点 kfree(pos); ``` 在这个例子中,我们可以在遍历过...
2,注意事项(对释放锁的控制,以及锁超时的控制)random_value 要保证唯一,可以用 trace_id 来保证!
los_dl_list_for_each_entry_safe的用法如下: ``` los_dl_list_for_each_entry_safe(pos, n, head, member) { // pos:当前节点指针 // n:下一个节点指针 // head:链表头指针 // member:链表节点在结构体中的成员名 //在这里进行节点的操作,比如打印节点信息、删除节点等 } ``` 其中,pos表示当前...
fail:list_for_each_entry_safe(c, n, &pod->containers,list) hyper_free_container(c);return-1; } 开发者ID:WeiZhang555,项目名称:hyperstart,代码行数:31,代码来源:parse.c 示例8: x_destroy ▲点赞 1▼ voidx_destroy(EV_P_ struct x_node *x){structx_node*c, *t;structsub_node*s, *u...
* list_for_each_safe - iterate over a list safe against removal of list entry * @pos: the &struct list_head to use as a loop counter. * @n: another &struct list_head to use as temporary storage * @head: the head for your list. ...
因此只遍历链表不删除节点时可以使用前者,若有删除节点的操作,则要使用后者。 由safe的说明可知,是专门为删除节点时准备的:iterate over a list safe against removal of list entry。 其他带safe的处理也基本源于这个原因。