Linux内核链表VS传统链表

本文解析了Linux内核中的链表实现方式,通过将数据和指针分离,实现了链表与数据类型的解耦。文章详细介绍了list_head结构体及entry的概念,并给出了访问节点数据的具体方法。

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

Linux内核中的链表是一个C实现的链表的典型

传统的链表都是数据和指针装在一个节点里:

struct node
{
	type data;
	struct node *prev,*next;
}
而内核链表把指针独立出来,做成节点,在被含有数据的entry包含:

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

struct entry
{
    struct list_head* list;
    type data;
};

用节点做为遍历的iterator,来处理数据。这样做很好得解决了一个问题,那就是如何使一个链表的实现能独立于数据。以往的方式,一种数据就得实现一套链表处理。C++中

用模板来解决,而内核链表是C,用这种方法来解决。

数据在节点以外,那怎么访问节点对应的数据呢?内核链表提供了这个宏:

#define list_entry(ptr, type, member) container_of(ptr, type, member)

而container_of的定义是:

#define container_of(ptr, type, member) ({ / const typeof( ((type *)0)->member ) *__mptr = (ptr); / (type *)( (char *)__mptr - offsetof(type,member) );})
offsetof是我们熟悉的:

#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
利用list_head在entry中的位置与list_head的指针,反推出entry的位置。

使用list_entry的方法:

如定义了
struct entry
{
    struct list_head* list;
    int data;
}myentry;
调用
struct entry* return_value=list_entry(list,struct entry,list);

return_value==&myentry;


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值