1. list_for_each_entry 宏
/*定义:*/
#define list_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))
list_for_each_entry()它实际上是一个 for 循环,利用传入的 pos 作为循环变量,从表头 head 开始,逐项向后(next 方向)移动 pos,直至又回head.
我们将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))
/*定义*/
#define list_entry(ptr, type, member) \
container_of(ptr, type, member) /* 作用:根据一个结构体变量中的一个域成员变量的指针来获取指向整个结构体变量的指针。 */
* member 为成员变量
* ptr 为接收指针
* type 为结构体类型
看一个例子吧:
list_for_each_entry(sd, &v4l2_dev->subdevs, list){
.../* 对sd进行操作 */
}
上面这个例子,其实是遍历v4l2_dev->subdevs(为list_head类型,一个双向链表),然后把v4l2_dev->subdevs所在的结构体变量的指针赋值给sd,
然后在循环中对sd进行操作
2. list_add和list_add_tail
调用list_add可以将一个新链表结点插入到一个已知结点的后面;
调用list_add_tail可以将一个新链表结点插入到一个已知结点的前面;
持续更新中...