Linux内核链表(二)
4)遍历
遍历是链表最经常的操作之一,为了方便核心应用遍历链表,Linux链表将遍历操作抽象成几个宏。
在介绍遍历宏之前,我们先看看如何从链表中访问到我们真正需要的数据项:
a)由链表结点到数据项变量
由上面的分析可知,内核链表中仅保存了数据项结构中list_head成员变量的地址,那么我们如何通过这个list_head成员访问到作为它的所有者的节点数据呢?在list.h文件中有一个list_entry(ptr,type,member)宏,其中ptr是指向该数据中list_head成员的指针,也就是存储在链表中的地址值,type是数据项的类型,member则是数据项类型定义中list_head成员的变量名。
#define list_for_each_safe(pos, n, head) \for (pos = (head)->next, n = pos->next; pos != (head); \pos = n, n = pos->next)
?
基本上list.h文件大部分内容就是这些,其他的关于hlist等内容暂不分析。
当然内核链表并不仅限于在内核使用,可以通过改写list.h文件使之可以应用在普通用户程序中。
?
参考资料:
IBM developerWorks:http://www.ibm.com/developerworks/cn/linux/kernel/l-chain/index.html? 深入分析linux内核链表
?
?
?