Linux内核中链表处理

本文详细介绍了Linux内核中用于管理链表的`struct list_head`结构及其相关遍历宏的使用方法,包括如何通过指针获取对应的结构体指针、如何实现安全的链表遍历等核心概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最基本的定义:

struct list_head
{
    struct list_head *next, *prev;
};

#define container_of(ptr, type, member) ({          \
const typeof(((type *)0)->member)*__mptr = (ptr);    \
    (type *)((char *)__mptr - offsetof(type, member)); })

通过指针ptr, 获取对应的结构体指针。其中member是typeof中的指针。ptr就是指向member。

#define list_for_each_entry(pos, head, member)   list_for_each_entry_safe(pos, pos, head, member)

#define list_for_each(pos, head)     for (pos = (head)->next; prefetch(pos->next), pos != (head); pos = pos->next)

上面的不但获取到写一个list_head,并且通过list_entry获取到list对应的结构体。

下面的pos则直接是head->next的类型,在Linux内核中一般是list_head类型。

#define list_for_each_safe(pos, n, head)    for (pos = (head)->next, n = pos->next; pos != (head);  pos = n, n = pos->next)

#define list_for_each_entry_safe(pos, n, head, member) \
for (pos = list_entry((head)->next, typeof(*pos), member), \
n = list_entry(pos->member.next, typeof(*pos), member);   &pos->member != (head);   pos = n, n = list_entry(n->member.next, typeof(*n), member))

该宏则通过n保存了pos对应的下一个对象,当在有删除操作时删除了当前节点还可以通过next继续遍历下去。其实在只要找到一个节点的时候完全没有必要这个n节点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值