Linux 内核中神一般的list
时间:2017-01-06作者:华清远见
一、实例内容与目标 众所周知,linux内核中有一个通用的双向循环list链表,为什么称他为通用的呢?首先我们还是来看一下内核中list中的结点是怎样定义的:
从上面我们的定义我们看到一个奇怪的地方,就是这个结构和我们以前接触过链表结点有一个不一样的地方,就是没有数据部分。呵呵,也许正因为这样它被称为神一般的list吧。 本文,我们只分析两点:
1.它是总样做到通用的
从上面可知,这个宏终等价与container_of().这个已经在揭开container_of神秘面纱译文中已经讲解过了,这里就不在过多的介绍了。 终呢,我们可以通过一个结构体变量的一个成员指针,找到这个结构体变量的首地址。呵呵,在这里你是否想到,如果我们把struct list_head作为一个结构体的一部分(实际上它也是通过这样做到通用的),在这里我们假设我们的结构体造型如下:
Struct test 现在假如我们有好多个struct test结果体变量,我们如何把这些结构体变量连起来呢?这个时候我们的神一般的list就派上用场了。 在linux内中,提供了下方法,对list进行操作
插入到链表头:
插入到链表尾:
删除链表节点:
将节点移动到另一链表:
将节点移动到链表尾:
判断链表是否为空,返回1为空,0非空
把两个链表拼接起来:
取得节点指针:
遍历链表中每个节点:
逆向循环链表中每个节点: 下面我们看一个实际的例子,感受一下:
上面的这个列子,只做了一个简单的操作,就是自己实现了一个双向循环链表的插入操作。 在主函数中,先是插入元素,然后打印元素。当然内核还提供了好多关于list的操作方法,读者可以自己去挖掘。
相关资讯
发表评论
|