内核链表源码注释理解!

来源:互联网 发布:win10国外优化软件 编辑:程序博客网 时间:2024/06/08 03:16
为了更好的理解内核链表源代码!! 为了日后复习内核链表!给自己有如下总结,方便日后自己查看!
请配合内核源码阅读!

首先:
typedef struct
{
 unsigned short ID;
 int connfd;
 struct list_head list;
}clinode, *clilist;
声明一个大结构体,里面内容包含你的个人需要的信息,后面加上内核链表。
其中 struct list_head xxx 这样就加入了一个内核链表

初始化节点:
INIT_LIST_HEAD(&大结构体指针head->list)
这里初始化的是第一个大结构体(即为头节点)里面的小结构体(即内核链表)!!
所以是取地址 &head->list

生成一个新的独立的节点:
(注意这里的节点是大结构体)(这里生成head,就是头结点,但不用对内容赋值就是了)
clilist new = calloc(1, sizeof(clinode));
if(new != NULL)
 {
  new->ID = ID;
  new->connfd = connfd;
  INIT_LIST_HEAD(&new->list);  这部分就跟前一点就是一样的道理了!
 }


把新节点加入到链表:
list_add(&new->list, &head->list);
这里传参也是对小结构体的操作!需要取地址。分别就是把新节点里的小结构体地址
与头结点里的小结构体的地址传进去!!
list_add_tail(&new->list,&head->list)   这个就是尾插而已!


删除一个节点:
这里的删除指的是让这个节点脱离链表,内存则是按需释放!
list_del(&one->list);
传参只需要把这个节点的小结构体拿出来传参。


遍历链表:
struct list_head *pos; 定义一个指向小结构类型的指针,用来定位,这个是不能访问到大结构体的!
 clilist p;       定义一个大结构体的指针,用来访问到大结构体!
 list_for_each(pos, &head->list)   遍历,传参POS  &head->list
 {
  p = list_entry(pos, clinode, list); list_entry是个宏定义,作用是把p变成指向pos所指的那个节点的指针!第二个参数是节点类型!第三个参数是小结构体list
  ·
  ·
  ·



原创粉丝点击