将复杂列表添加到linux内核中的task_struct

时间:2012-04-30 14:39:54

标签: c linux-kernel

如何在sched.h文件中的struct task_struct中添加一个字段,该字段由一个带有特殊非原始节点的链表组成?

说我有这个结构:

struct Node{
 int counter;
 char* buffer;
 int sum;
} 

依此类推,我想添加一个这样的节点列表?我不想用

重新实现列表
struct Node{
 int counter;
 char* buffer;
 int sum;
 Node* next;
} 

但我想使用struct list_head和通用内核列表而不是我的实现。但是将struct list_head添加到task_struct只是给了我另一个task_struct实例,而我想用我的特定字段添加我的特殊列表。

就C ++而言,我想将List添加到struct_task中,因此文件scehd.h看起来像

struct task_struct {
.
.
.
List<Node> myList;
.
.
}

我该怎么做?如何在INIT_TASK宏中初始化我的节点?

1 个答案:

答案 0 :(得分:1)

你说“将struct list_head添加到task_struct只是给了我另一个task_struct实例”。哪不是真的,除非我误解了你。

struct list_head添加task_struct只会在struct list_head中为您提供task_struct,仅此而已。由您来决定使用list_head的内容。

要实现您的想法,您需要以下内容:

struct task_struct {
    ...
    struct list_head node_list;
};

struct your_node {
    struct list_head list;
    int counter;
    char* buffer;
    int sum;
};

创建task_struct后,您将node_list初始化为空列表。当您创建your_node的实例时,您也会这样做,然后将其添加到node_list

list_add_tail(&your_node->list, &your_task->node_list);

有关真实示例,请参阅perf_event_list中的task_struct,以及kernel/events/core.c中迭代它的代码。