Linux 内核链表

6/18/2022 Linux 内核

linux 内核中提供了一种精妙无比的链表API,本文介绍其常用的用法

# 定义

LIST_HEAD_INIT 宏将会自动定义 test_head 变量

struct list_head test_head = LIST_HEAD_INIT(test_head);
1

定义节点

typedef struct {
    struct list_head head;
    char name[32];
    unsigned int name_len;
} node;
1
2
3
4
5

# 判断链表是否为空

list_empty(&test_head)
1

# 增加元素

精妙之处就在于链表与数据类型无关,正常的链表是基于数据结构成为链表,而linux内核提供的链表恰好相反,是将数据结构挂在链表上

注: 增加元素前最好加读锁,否则可能有线程安全问题

node *n = NULL;

n = kzalloc(sizeof(node), GFP_KERNEL);
list_add(&(n->head), &test_head);
1
2
3
4

# 遍历链表

list_for_each_entry_safe 宏展开后是 for 循环,所以这个结构中可以使用 continue,并且会在遍历结束后自动将头指针放回。

注: 遍历前最好加读锁,否则可能有线程安全问题

struct *node, *n = NULL;
list_for_each_entry_safe(node, n, &test_head, head) {
     printk("%s %d", node->name, node->name_len);
}
1
2
3
4
Last Updated: 2/11/2023, 2:30:05 AM