了解struct task list_head

时间:2014-04-21 03:50:44

标签: c linux-kernel

我有一个结构my_struct我找到了一个指南,说有一个非常容易使用的链表,我需要做的就是在我的结构中包含一个task list_head,但我不是&# 39;了解如何正确遍历此列表,因为我不知道列表的实际结构

[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;
}

有人可以解释这个链表实际上是如何运作的吗?

1 个答案:

答案 0 :(得分:0)

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

(这些包括标题可以在/ usr / src / linux /下找到)

-

'list.h'内核头文件定义了Linux内核的唯一可接受的链表实现(根据kernel.org的人员)。在本文中,'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'来迭代列表。