0

我写了一个关于以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);
4

1 回答 1

1

您只是在每个条目的列表末尾有一个分号,这意味着您的位置被设置为内存中的垃圾值(不是真正的垃圾,只是内存中分配的 list_head pri 结构后面的偏移量)因此您获得随机值取消引用(您不幸地落在了您可以访问的内存中,因此有时很难发现错误。)循环中的单次运行应该已经提示您,因为 list_for_each_entry 的以下部分只是作为范围块执行。

于 2012-12-07T08:40:31.903 回答