Linux内核链表的研究与应用(9)

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来遍历链表元素

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/55d44a25386278bfb811a0069ff678d9.html