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