list_first_entry链接列表linux内核数组

时间:2015-04-10 21:49:53

标签: linux-kernel linked-list

我有一个类似

的结构
struct my_struct {
     struct list_head queues[NB_QUEUES];
};

我想访问其中一个队列的第一个元素(索引是计算的,但我拿2个例子,它是< NB_QUEUES),如下所示(没有数组)

struct list_head t = list_first_entry(&foo->queues[2], struct my_struct, ???);

我应该怎么做才能在索引2处获取队列的第一个元素?我没有找到任何编译

的内容

1 个答案:

答案 0 :(得分:7)

所以,你的代码不是很清楚。让我们来谈谈一个更通用的例子:

  1. 我有NB_QUEUES队列。我只是将这些存储为全局变量:

    struct list_head queues[NB_QUEUES];
    
  2. 我们希望确保我们的列表已初始化。我们可以使用LIST_HEAD_INIT静态地执行此操作,或者在运行时使用INIT_LIST_HEAD

    int i;
    for (i=0; i<NB_QUEUES; ++i)
        INIT_LIST_HEAD(&queues[i]);
    
  3. 然后我们可以将type元素的对象推送到其中一个队列中:

    struct element {
        struct list_head list;
        int data;
        float more_data;
    };
    
    struct element *v = kmalloc(sizeof(*v), GFP_KERNEL);
    v->data = 4;
    v->more_data = 7.2;
    
    list_add(&v.list, &queues[2]);
    
  4. 稍后,我们可以访问列表中的第一个元素。

    struct element *q = list_first_entry(&queues[2], struct element, list);
    

    list参数来自我们在将此对象插入链接列表时使用的struct element成员的名称。

相关问题