9.从当前某个结点开始进行遍历
1>function:
从当前某个结点开始进行遍历,list_for_entry_continue是从某个结点之后开始进行遍历。Linux提供了以下函数进行从当前某个结点开始进行遍历
list_for_each_entry_from(pos,head,member)
list_for_each_entry_safe_from(pos,n,head,member)
2>接口
list_for_each_entry_from(pos,head,member)
pos: 用于遍历的指针,只是它的数据类型是结构体类型而不是strut list_head 类型
head: 链表的头指针
member:该数据项类型定义中list_head成员的变量名
list_for_each_entry_safe_from(pos,n,head,member)
pos:用于遍历的指针,只是它的数据类型是结构体类型而不是strut list_head 类型
n: 临时指针用于占时存储pos的下一个指针
head:链表的头指针
member该数据项类型定义中list_head成员的变量名
3>函数实现
(1)list_for_each_entry_from实现
#define list_for_each_entry_from(pos, head, member) \
for (; &pos->member != (head); \
pos = list_entry(pos->member.next, typeof(*pos), member))
可以看到for循环从当前结点开始进行遍历。
(2)list_for_each_entry_safe_from实现
#define list_for_each_entry_safe_from(pos, n, head, member) \
for (n = list_entry(pos->member.next, typeof(*pos), member);\
&pos->member != (head); \
pos = n, n = list_entry(n->member.next, typeof(*n), member))
功能与list_for_each_entry_safe_from相同,不同的是list_for_each_entry_from不能用于遍历链表时进行删除操作,而list_for_entry_safe_entry_from可以用于链表遍历时进行删除操作。
10.list_safe_reset_next
1>function:
通过pos结构体指针获得结构体n的指针(具体在什么场合使用不太清楚,往大牛指点)
2>接口:
list_safe_reset_next(pos,n,member)
pos:用于遍历循环的指针(用于list_for_each_entry_safe遍历中),只是它的数据类型是结构体类型而不是strut list_head 类型
n:在list_for_each_entry_safe中用于临时存储post的下一个指针
member: 该数据项类型定义中list_head成员的变量名
六.内核链表的应用
分析了内核链表就要对其进行应用。个人认为我们可以将其复用到用户态编程中,以后在用户态下编程就不需要写一些关于链表的代码了,直接将内核中list.h中的代码拷贝过来用。也可以整理出my_list.h,在以后的用户态编程中直接将其包含到C文件中。当然,我们也可以在内核层对其进行应用。
代码见:
具体下载目录在 /2013年资料/1月/17日/Linux内核链表的研究与应用
说明:切记在删除元素时,要用list_for_each_safe,而不能用list_for_each来遍历链表元素