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

list

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

1. 定义链表节点

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

c 复制代码
#include <linux/list.h>

struct my_node {
    int data;
    struct list_head list;  // 链表节点
};

2. 初始化链表

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

c 复制代码
INIT_LIST_HEAD(&mng->active_list);

3. 添加节点

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

  • 在链表头添加:
c 复制代码
struct my_node *new_node = kmalloc(sizeof(struct my_node), GFP_KERNEL);
new_node->data = 42;
list_add(&new_node->list, &my_list);  // 添加到链表头
  • 在链表尾添加:
c 复制代码
list_add_tail(&new_node->list, &my_list);  // 添加到链表尾

4. 遍历链表

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

c 复制代码
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 删除链表中的节点:

c 复制代码
list_del(&node_to_delete->list);  // 从链表中删除节点
kfree(node_to_delete);  // 释放节点内存

6. 检查链表是否为空

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

c 复制代码
if (list_empty(&my_list)) {
    printk("List is empty\n");
}

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

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

相关推荐
爱读书的小胖1 小时前
LeetCode 27. 移除元素(C)解题分析
数据结构·算法
爱读书的小胖2 小时前
Codewars: A Brave New Wordle(C)解题分析
c语言·数据结构·算法
Escalating_xu2 小时前
【数据结构】顺序表的应用:动态通讯录项目与双指针经典算法
c语言·数据结构·算法
从小白到软工3 小时前
C语言(中)预告
c语言·数据结构·经验分享·ai编程
垆边人似月.3 小时前
华为题:任务调度
数据结构·c++·算法
Logic1013 小时前
C语言/数据结构字符串题解:解压缩“字符+次数“格式——多位数字处理与字符串还原
c语言·数据结构·字符串·模拟·时间复杂度·空间复杂度·算法题
信奥卷王3 小时前
[GESP202506 六级] 最大因数(含视频)
数据结构·算法
局部有解4 小时前
Leetcode - 42 接雨水(一维)
数据结构·c++·算法·leetcode
专注API从业者4 小时前
告别手工盯盘:用 Open‑Claw 搭建电商商品自动化监控与数据分析实战
运维·数据结构·数据挖掘·数据分析·自动化
Logic1015 小时前
C语言/数据结构位运算题解:异或XOR找出糖葫芦派对中的“独一无二山楂果数量“——只出现一次的数字
c语言·数据结构·数组·位运算·时间复杂度·算法题·异或性质