kernel list

来源:互联网 发布:轻纺城金融网络借贷 编辑:程序博客网 时间:2024/06/14 10:32

头文件:#include <linux/list.h>
struct list_head {
        struct list_head *next, *prev;
};

struct my_list {
        struct list_head list;
        void *mydata;
};
list相当于一条线,把一组数据串起来,形成一个循环链表。内核提供一组API用于维护和访问这组数据。
比如插入结点、删除结点、访问结点等。内核定义好的list这个结构和一组API可以让我们方便、安全的
维护链表。
初始化:
需要定义一个头结点,作为访问、操作的入口
struct my_list my_data_head;
头结点的数据域一般不用,或者可以保存一些统计信息。
INIT_LIST_HEAD(&(my_data_head.list));

添加结点:
struct my_list *new_node;
set_node(&new_node);   //假定的函数,分配内存给new_node并赋值
list_add(&(new_node->list), &(my_data_head.list));

删除结点:
struct list_head *pos, *n;
struct my_list *cur;
list_for_each_safe(pos, n, &(my_list.list))
{
        cur = list_entry(pos, struct my_list, list);
        if (condition)
        {
                list_del(pos);
                kfree(cur);
        }
}

遍历结点:
list_for_each_safe(pos, n, &(my_list.list))
{
        cur = list_entry(pos, struct my_list, list);
}
除以上几个API外,操作struct list_head的API还有很多。基本上也就是添加、删除、遍历这些操作。只是
不同的API应用的环境,内部的实现有些不同。比如前插、后插,从前往后遍历、从后往前遍历等等。总之,
就是提供了一种定义好的方法使我们可以方便、安全的把一组数据组织成链表。

原创粉丝点击