主页 > 开源代码  > 

内核数据结构用法(2)list

内核数据结构用法(2)list
list

在 Linux 内核中,链表操作是通过一组宏和函数来实现的,这些操作通常用来管理和遍历链表。以下是一些常用的链表函数和宏的具体用法。

1. 定义链表节点

首先,你需要定义一个包含 struct list_head 的结构体:

#include <linux/list.h> struct my_node { int data; struct list_head list; // 链表节点 }; 2. 初始化链表

使用 INIT_LIST_HEAD函数初始化链表头:

INIT_LIST_HEAD(&mng->active_list); 3. 添加节点

可以使用以下函数来添加节点:

在链表头添加: struct my_node *new_node = kmalloc(sizeof(struct my_node), GFP_KERNEL); new_node->data = 42; list_add(&new_node->list, &my_list); // 添加到链表头 在链表尾添加: list_add_tail(&new_node->list, &my_list); // 添加到链表尾 4. 遍历链表

可以使用 list_for_each 或 list_for_each_entry 宏遍历链表:

struct my_node *pos; list_for_each_entry(pos, &my_list, list) { printk("Data: %d\n", pos->data); }

若要遍历删除节点,则要使用list_for_each_entry_safe。

5. 删除节点

使用 list_del 删除链表中的节点:

list_del(&node_to_delete->list); // 从链表中删除节点 kfree(node_to_delete); // 释放节点内存 6. 检查链表是否为空

可以使用 list_empty 函数检查链表是否为空:

if (list_empty(&my_list)) { printk("List is empty\n"); }

list_entry 宏用于将链表节点指针转换为包含该节点的结构体指针。

list_first_entry 宏用于获取链表第一个节点的指针,并转换为包含该节点的结构体指针。

标签:

内核数据结构用法(2)list由讯客互联开源代码栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“内核数据结构用法(2)list