内核的链表实现很灵活,经过在结构体中插入list,便可把结构体串成一个链表,而不是建立list,然后将结构体塞入list中。
那么如何经过遍历一个结构体list呢。由于实际的list,只是结构体中某个变量的list,须要经过该变量地址,计算得出结构体的地址,这样遍历了变量的时候,也就遍历告终构体。这就是list_for_each_entry所做的。code
循环list对应的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))
该for循环能够当作三部分for循环
根据list变量地址,获取entry的地址
#define list_entry(ptr, type, member) \ container_of(ptr, type, member)
ptr: list变量 type:entry对于的结构体类型 member:list在entry的名称
#define container_of(ptr, type, member) ({ \ typeof( ((type *)0)->member ) *__mptr = (ptr); \ (type *)( (char *)__mptr - offsetof(type,member) );})