热门关键字:  ubuntu  分区  函数  Fedora  linux系统进程

当前位置 :| 主页>Linux教程>内核研究>

something about list_head (1)

来源: 作者: 时间:2008-08-18 Tag: 点击:
打算先拿list_head来开开刀,因为在kobject中能看到这个list_head。碰巧在《Linux内核设计与实现》的附录A也有详细的说明。一步一步来。
<linux/list.h> from 2.6.10

#define LIST_POISON1 ((void *) 0x00100100)
#define LIST_POISON2 ((void *) 0x00200200)

用法尚未明确


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

list_head结构的定义。说来也奇怪,以前学习链表时从来没有想象过一个链表节点居然就只有两个指针,连存放实用数据的地方也没有。对此,《Linux内核设计与实现》中是这样说的,“一个list_head结构体本身没有什么意义,通常需要把它潜入到自己的结构体中”。

1.初始化
链表在使用前需要先初始化,常见的情况是在运行时初始化链表,在分配完自己的结构后使用INIT_LIST_HEAD。如果在编译时静态创建链表,使用LIST_HEAD_INIT。直接声明和初始化一个静态链表使用LIST_HEAD


#define LIST_HEAD_INIT(name) { &(name), &(name) }

从名字能猜测,LIST_HEAD_INIT是用来初始化list_head,并且是静态创建链表。但从代码中可以看到,LIST_HEAD_INIT只是简单的把参数name的地址求两遍。由于链表静态创建,其实是包含list_head结构的自己的结构的空间已经分配好,所以只需把next和prev指针的指向确定好就行了。
就如:

struct my_struct {
struct list_head list;
...
};

struct my_struct mine = {
.list = LIST_HEAD_INIT(mine.list);
/*相当于 list = {&mine.list, &mine.list};*/
...
};

这里list结构里的next和prev指针分别指向包含list结构的mine的自身。
最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名: 密码:
匿名?
注册