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
宏用于获取链表第一个节点的指针,并转换为包含该节点的结构体指针。