linux内核list.h头文件分析(一)
来源:互联网 发布:天谕萨菲罗斯捏脸数据 编辑:程序博客网 时间:2024/05/22 05:12
之前上《linux操作系统》课程的时候,陈老师安排的一个作业就是分析linux内核中的头文件list.h,但是之前我没有认真做,都是完成任务式的去做。
今天比较伤心些,一个同学问我list.h中的
- #define LIST_HEAD_INIT(name) { &(name), &(name) }
- #define LIST_HEAD(name) \
- struct list_head name = LIST_HEAD_INIT(name)
宏代表什么含义,一时没有给她解释清楚,于是下决心把这个list.h认真的分析一边,给她一个满意的答复。由于内容比较多,我把list.h头文件的分析分为了几个部分。
(一)结构体定义
- struct list_head {
- struct list_head *next, *prev;
- };
- #define LIST_HEAD_INIT(name) { &(name), &(name) }
- #define LIST_HEAD(name) \
- struct list_head name = LIST_HEAD_INIT(name)
申请一个变量LIST_HEAD(temp)等价于这个:
struct list_head temp = {&(temp), &(temp)}
附带知识:
- 结构体赋值:
- 1、对成员赋值
- 例如结构体struct st1 {
- int a;
- int b;
- int c;
- }
- 1.1 用{}形式
- struct st1 st1 = {1,2,3);
- 1.2 linux kernel风格.
- struct st1 st1 = {
- .a = 1;
- .b = 2;
- };
- //注 此风格(即在成员变量之前加点“.”),可以不按成员变量的顺序进行赋值。如可以为
- struct st1 st1 = {
- .c = 3;
- .a = 1;
- .b = 2;
- };
- 2 对整体赋值.
- struct st1 a, b;
- b = a;
- 3 结构体作为函数返回值对另一个结构体赋值.
- struct st1 func1();
- struct st1 a = func1();
(二)结构体初始化
结构体初始化函数:
- static inline void INIT_LIST_HEAD(struct list_head *list)
- {
- list->next = list;
- list->prev = list;
- }
初始化结构体list指向自己本身。
对于(一)结构体定义和(二)结构体初始化来说,最终的效果是一样的,都是将一个
struct list_head变量指向自己本身。
可以写一个小的程序测试一下
- /*test.c*/
- #include <stdio.h>
- struct list_head {
- struct list_head *next, *prev;
- };
- #define LIST_HEAD_INIT(name) { &(name), &(name) }
- #define LIST_HEAD(name) \
- struct list_head name = LIST_HEAD_INIT(name)
- static inline void INIT_LIST_HEAD(struct list_head *list)
- {
- list->next = list;
- list->prev = list;
- }
- int main()
- {
- LIST_HEAD(temp);
- printf("%p %p %p\n", (&temp)->prev, (&temp)->next, &temp);
- INIT_LIST_HEAD(&temp);
- printf("%p %p %p\n", (&temp)->prev, (&temp)->next, &temp);
- return 0;
- }
- 运行结果:
- ^_^[sunny@sunny-laptop ~/DS]11$ ./a.out
- 0xbf8191a8 0xbf8191a8 0xbf8191a8
- 0xbf8191a8 0xbf8191a8 0xbf8191a8
- ^_^[sunny@sunny-laptop ~/DS]12$
可以看出他们完毕之后的地址都是一样的。
(三)增加结点
附带知识:
- 内联函数 inline
- 在c 中,为了解决一些频繁调用的小函数而大量消耗栈空间或者是叫栈内存的问题,特别的引入了inline修饰符,表示为内联函数。
- 内联函数使用inline关键字定义,
- 并且函数体和声明必须结合在一起,
- 否则编译器将他作为普通函数对待。
- inline void function(int x); //仅仅是声明函数,没有任何效果
- inline void function(int x) //正确
- {
- return x;
- }
增加结点的话,有两种方式:头插法和尾插法。
我们调用的话就调用
static inline void list_add(struct list_head *new, struct list_head *head);
static inline void list_add_tail(struct list_head *new, struct list_head *head);
这两个接口。
头插法:
static inline void list_add(struct list_head *new, struct list_head *head)
{
__list_add(new, head, head->next);
}
尾插法:
static inline void list_add_tail(struct list_head *new, struct list_head *head)
{
__list_add(new, head->prev, head);
}
真正的实现插入:
static inline void __list_add(struct list_head *new,
struct list_head *prev,
struct list_head *next)
{
next->prev = new;
new->next = next;
new->prev = prev;
prev->next = new;
}
__list_add(new, prev, next):表示在prev和next之间添加一个新的节点new
所以对于list_add()中的__list_add(new, head, head->next)表示的在head和
head->next之间加入一个新的节点,是头插法。
对于list_add_tail()中的__list_add(new, head->prev, head)表示在head->prev(双向循环链表的最后一个结点)和head之间添加一个新的结点。
1
上一篇:线性表的合并
下一篇:linux内核list.h头文件分析(二)
相关热门文章
- linux设备驱动之USB数据传输分...
- QEMU源码分析系列(四)...
- 研究说:失眠的人刷微博、朋友...
- 内核头文件的使用
- 物联网MQTT协议分析和开源Mosq...
- test123
- 编写安全代码——小心有符号数...
- 彻底搞定C语言指针详解-完整版...
- 使用openssl api进行加密解密...
- 一段自己打印自己的c程序...
- linux dhcp peizhi roc
- 关于Unix文件的软链接
- 求教这个命令什么意思,我是新...
- sed -e "/grep/d" 是什么意思...
- 谁能够帮我解决LINUX 2.6 10...
给主人留下些什么吧!~~
随1意2o2011-08-14 17:06:38
建刚 太强了
回复 | 举报
评论热议
0 0
- linux内核list.h头文件分析(一)
- linux内核list.h头文件分析
- linux内核中链表代码分析---list.h头文件分析(一)
- linux内核list.h头文件分析(二)
- linux内核list.h头文件分析(三)
- linux内核list.h头文件分析(四)
- linux内核list.h头文件分析(七)——list.h应用
- linux内核中链表代码分析---list.h头文件分析(二)
- linux内核list.h头文件分析(五)——hlist分析
- linux内核list.h头文件分析(六)——hlist分析
- linux内核list.h分析(一)
- linux内核中的list.h文件中线性链表的分析(一)
- linux 内核链表操作头文件list.h
- linux 内核链表操作头文件list.h C++
- list.h头文件分析
- list.h头文件分析
- Linux下~Hash表的构建与应用(包括内核文件list.h分析)
- linux内核中的list.h文件中线性链表的分析(二)
- 一些关于操作excel的 library
- 基于Spring Security 的JSaaS应用的权限管理
- c语言宏定义总结
- echarts柱图小结(部分转载)
- 线性表的合并
- linux内核list.h头文件分析(一)
- 纪念入坑随笔
- linux内核list.h头文件分析(二)
- js库Modernizr的介绍和使用
- linux内核list.h头文件分析(三)
- java关于正则相关的函数的应用--compile(),match(),find(),group(),
- 你知道精通自动化测试有多重要吗?
- linux内核list.h头文件分析(四)
- 时序分析/约束——Xilinx时钟资源 & ISE时序分析器
原创粉丝点击
热门IT博客
热门问题
老师的惩罚
人脸识别
我在镇武司摸鱼那些年
重生之率土为王
我在大康的咸鱼生活
盘龙之生命进化
天生仙种
凡人之先天五行
春回大明朝
姑娘不必设防,我是瞎子
盘符参数非法怎么办?
win7未识别网络怎么办
dnf一直修复失败怎么办
拼多多助力异常怎么办
英雄联盟总崩溃怎么办
ios更新不了游戏怎么办
win7开机卡住不动怎么办
dnf安装md5错误怎么办
lol游戏无限崩溃怎么办
毛豆车贷逾期怎么办
电脑运行lol慢怎么办
苹果6卡屏不能动怎么办
刺激战场卡屏怎么办
风管机以后更换怎么办
墙上壁纸开胶了怎么办
壁纸边上开胶了怎么办
汽车门折页响怎么办
室内门合页响怎么办
民宿被警察查了怎么办
赌博输惨了怎么办
携程拿去花风控怎么办
九州账号被锁定怎么办
微信被盗被解绑怎么办
微信号被盗怎么办找回
微信经常被盗怎么办
母猫转移小猫怎么办
母猫叼小猫换窝怎么办
部落冲突被盗了怎么办
买股票涨停后怎么办
小花钱包不到账怎么办
天学网账号忘了怎么办
欧创gps显示离线怎么办
win10电脑开机慢怎么办
win7电脑开机慢怎么办
电脑玩阴阳师卡怎么办
ppt文件路径无效怎么办
ug不是部件文件怎么办
wps打开是乱码怎么办
电脑wps出现乱码怎么办
手机wps文档乱码怎么办
wps预览转换中怎么办