我写了一个关于链接列表的模块,其中 pri 作为头节点。它最初是空的。
在pri_init()中,我在列表中插入3个节点,并为每个节点分配值。最后,我想使用 list_for_each_entry 来迭代列表并打印出节点的值。
但实际上,它只是在pri_init()的 list_for_each_entry {...} 中打印出1个随机值。
相反,如果我在 for()循环 中使用 container_of 来迭代列表,结果是正确的。
谁能告诉我为什么?非常感谢。
#include <linux/init.h>
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/errno.h>
#include <asm/uaccess.h>
#include <linux/list.h>
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/sched.h>
MODULE_LICENSE("GPL");
struct pri_listitem
{
int v;
struct list_head list;
};
LIST_HEAD(pri);
void pri_exit(void)
{
struct pri_listitem *list_p, *next;
list_for_each_entry_safe(list_p, next, &pri, list)
{
list_del(&list_p->list);
kfree(list_p);
}
printk(KERN_ALERT "***** device pri exit() ***** \n");
}
int pri_init(void)
{
int i;
struct pri_listitem *list_p;
printk(KERN_ALERT "***** device pri init() ***** \n");
// Inserting 3 nodes
for(i=1; i<=3; ++i)
{
list_p = kmalloc(sizeof(struct pri_listitem),GFP_KERNEL);
if(!list_p)
{
printk(KERN_DEBUG "Error: alloction memory for list_p\n");
return -ENOMEM;
}
memset(list_p, 0, sizeof(struct pri_listitem));
list_p->v = i;
list_add(&(list_p->list), &pri);
}
printk(KERN_DEBUG "value of the 3 nodes:\n");
list_for_each_entry(list_p, &pri, list);
{
printk(KERN_DEBUG "%d\n",list_p->v); // print nodes' value
}
return 0;
}
module_init(pri_init);
module_exit(pri_exit);
答案 0 :(得分:1)
你只是在每个条目的列表末尾都有一个半冒号,这意味着你的位置被设置为内存中的垃圾值(实际上垃圾只是你在内存中分配的list_head pri结构后面的一个偏移)因此你得到了取消引用的随机值(你不幸地落入你可以访问的内存中,因此有时很难发现错误。)通过循环的单个运行应该会让你失望,因为list_for_each_entry上的下一部分只是作为一个范围的块执行。 / p>