【问题标题】:Understanding struct task list_head了解结构任务 list_head
【发布时间】:2014-04-21 03:50:43
【问题描述】:

我有一个结构my_struct 我发现一个指南说有一个非常易于使用的链表,我需要做的就是在我的结构中包含一个task list_head,但我不明白如何正确遍历此列表,因为 我不知道该列表的实际结构

[edit] 这个内核链接列表实际上是如何工作的?请解释一下。

#include <linux/blkdev.h>
#include <linux/bio.h>
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/init.h>

在内核之外试试这个:

 #include "list.h"

// my list of elements
struct my_struct
{
    struct task list_head;
}

然后我声明我的列表的头部:

struct my_struct *head;

内存是这样的头部malloc:

head = malloc(sizeof(*head));

我可以使用类似的东西;

int count_elements_in_list()
{
   int size = 0;

   struct my_list *pos;

   list_for_each(pos, head)
   {
      size++;
   }

   return size;
}

有人能解释一下这个链表是如何工作的吗?

【问题讨论】:

  • 你不能按原样遍历这个,没有什么可以遍历的,那么你的问题是如何遍历一个不存在的列表或如何构建一个链表?
  • 我很确定该列表存在。我一开始就为头部分配了内存。
  • 如果没有看到定义列表元素的结构,我们无法回答。
  • @user3555302,我假设有一个#included '.h' 文件描述了'for_each()'。我相信'.h'文件是理解代码的关键。
  • 其实没有;目前还不清楚——根本不清楚(因为我是对评论投赞成票的人)。要创建一个链表,你需要一些指针;你没有显示指针。这就是我们感到困惑的原因。您没有向我们提供对回答您的问题至关重要的信息。

标签: c linux-kernel


【解决方案1】:

在您的代码中,您包含了“module.h”;这是大多数 Linux 内核模块的标准包含模块。 “module.h”文件包括“list.h”。

(这些包含头文件可以在 /usr/src/linux/ 下找到)

-

“list.h”内核头文件定义了 Linux 内核的唯一可接受的链表实现(根据 kernel.org 人员)。在 tern 中,'list.h' 包括 'types.h',它定义了以下内容:

struct list_head { 
   struct list_head *next, *prev;
   }

在提供给您问题的代码中:

 struct task list_head;

'struct task' 包含一个'struct list_head' 元素。后来:

list_for_each() 

在'list.h'中定义,需要使用'pos'和'head'来迭代列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-16
    • 2020-05-10
    • 2016-04-27
    • 2019-01-08
    • 2017-03-12
    相关资源
    最近更新 更多