list_for_each_entry不起作用

时间:2012-12-07 08:31:28

标签: linux module linux-kernel linux-device-driver kernel-module

我写了一个关于链接列表的模块,其中 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);

1 个答案:

答案 0 :(得分:1)

你只是在每个条目的列表末尾都有一个半冒号,这意味着你的位置被设置为内存中的垃圾值(实际上垃圾只是你在内存中分配的list_head pri结构后面的一个偏移)因此你得到了取消引用的随机值(你不幸地落入你可以访问的内存中,因此有时很难发现错误。)通过循环的单个运行应该会让你失望,因为list_for_each_entry上的下一部分只是作为一个范围的块执行。 / p>