内核数据结构用法(2)list
- 开源代码
- 2025-08-27 05:27:02

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”