LIST_ENTRY使用

 

VOID LinkListTest()

{

       LIST_ENTRY linkListHead;

       //初始化链表

       InitializeListHead(&linkListHead);

 

       PMYDATASTRUCT pData;

       ULONG i = 0;

       //在链表中插入10个元素

       KdPrint(("Begin insert to link list"));

       for (i=0 ; i<10 ; i++)

       {

              pData = (PMYDATASTRUCT)

                     ExAllocatePool(PagedPool,sizeof(MYDATASTRUCT));

              pData->number = i;

              InsertHeadList(&linkListHead,&pData->ListEntry);

       }

 

       //从链表中取出,并显示

       KdPrint(("Begin remove from link list\n"));

       while(!IsListEmpty(&linkListHead))

       {

              PLIST_ENTRY pEntry = RemoveTailList(&linkListHead);

              pData = CONTAINING_RECORD(pEntry,

                              MYDATASTRUCT,

                              ListEntry);

              KdPrint(("%d\n",pData->number));

              ExFreePool(pData);

       }

 }

 

遍历

PLIST_ENTRY pLink=NULL;
 for(pLink = glinkListRule.Flink; pLink !=(PLIST_ENTRY) &glinkListRule.Flink; pLink = pLink->Flink)
 {
  pRegPrtRule pData= CONTAINING_RECORD(pLink,RegPrtRule,ListEntry);
  
 }

`list_last_entry` 是 Linux 内核中一个用于双向链表操作的宏,定义于 `<linux/list.h>` 头文件中。其主要功能是获取双向链表的最后一个元素。 ### 功能 `list_last_entry` 宏用于从双向链表中获取最后一个节点对应的结构体实例。它借助链表头和结构体类型,通过偏移计算定位到结构体的起始地址,从而返回指向该结构体的指针。 ### 原型 ```c #define list_last_entry(ptr, type, member) \ list_entry((ptr)->prev, type, member) ``` 其中: - `ptr`:指向链表头的指针。 - `type`:包含链表节点的结构体类型。 - `member`:结构体中 `struct list_head` 类型的成员名。 ### 使用方法 以下是一个简单的示例,展示了 `list_last_entry` 的使用: ```c #include <linux/init.h> #include <linux/module.h> #include <linux/list.h> // 定义包含链表节点的结构体 struct my_struct { int data; struct list_head list; }; // 定义链表头 LIST_HEAD(my_list); static int __init my_module_init(void) { struct my_struct *entry; int i; // 向链表中添加节点 for (i = 0; i < 5; i++) { entry = kmalloc(sizeof(*entry), GFP_KERNEL); if (!entry) { return -ENOMEM; } entry->data = i; list_add_tail(&entry->list, &my_list); } // 获取链表的最后一个节点 entry = list_last_entry(&my_list, struct my_struct, list); printk(KERN_INFO "Last entry data: %d\n", entry->data); return 0; } static void __exit my_module_exit(void) { struct my_struct *entry, *tmp; // 释放链表节点 list_for_each_entry_safe(entry, tmp, &my_list, list) { list_del(&entry->list); kfree(entry); } } module_init(my_module_init); module_exit(my_module_exit); MODULE_LICENSE("GPL"); ``` 在这个示例中,首先定义了一个包含 `struct list_head` 成员的结构体 `my_struct`,并创建了一个链表头 `my_list`。接着,向链表中添加了 5 个节点。然后,使用 `list_last_entry` 宏获取链表的最后一个节点,并打印其数据。最后,在模块退出时释放链表节点的内存。 ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值