Linux内核中链表的实现与应用【转】
转自:http://blog.chinaunix.net/uid-27037833-id-3237153.html
链表(循环双向链表)是Linux内核中最简单、最常用的一种数据结构。
点击(此处)折叠或打开
- #include <linux/kernel.h>
- #include <linux/module.h>
- #include <linux/slab.h>
- #include <linux/list.h>
- MODULE_LICENCE("GPL");
- MODULE_AUTHOR("LUOTAIJIA");
- #define N 10
- struct numlist {
- int num;
- struct list_head list;
- };
- struct numlist numhead;
- static int __init doublelist_init(void)
- {
- //初始化头结点
- struct numlist * listnode; //每次申请链表结点时所用的指针
- struct list_head * pos;
- struct numlist * p;
- int i;
- printk("doublelist is starting...\n");
- INIT_LIST_HEAD(&numhead.list);
- /*
- * static inline void INIT_LIST_HEAD(struct list_head *list)
- * {
- * list->next = list;
- * list->prev = list;
- * }
- */
- //建立N个结点,依次加入到链表当中
- for (i=0; i<N; i++) {
- listnode = (struct numlist *)kmalloc(sizeof(struct numlist), GFP_KERNEL);
- //void *kmalloc(size_t size, int flages)
- //分配内存,size 要分配内存大小,flags 内存类型
- listnode->num = i+1;
- list_add_tail(&listnode->list, &numhead.list);
- printk("Node %d has added to the doublelist...\n", i+1);
- }
- //遍历链表
- i = 1;
- list_for_each(pos, &numhead.list) {
- p = list_entry(pos, struct numlist, list);
- printk("Node %d's data: %d\n", i, p->num);
- i++;
- }
- return 0;
- }
- static void __exit doublelist_exit(void)
- {
- struct list_head *pos, *n;
- struct numlist *p;
- int i;
- //依次删除N个结点
- i = 1;
- list_for_each_safe(pos, n, &numhead.list) {
- //为了安全删除结点而进行的遍历
- list_del(pos); //从链表中删除当前结点
- p = list_entry(pos, struct numlist, llist);
- //得到当前数据结点的首地址,即指针
- kfree(p); //释放该数据结点所占空间
- printk("Node %d has removed from the doublelist...\n", i++);
- }
- printk("doublelist is exiting...\n");
- }
- module_init(doublelist_init);
- module_exit(doublelist_exit);
Linux内核中链表的实现与应用【转】的更多相关文章
- linux内核中链表代码分析---list.h头文件分析(一)【转】
转自:http://blog.chinaunix.net/uid-30254565-id-5637596.html linux内核中链表代码分析---list.h头文件分析(一) 16年2月27日17 ...
- linux内核中链表代码分析---list.h头文件分析(二)【转】
转自:http://blog.chinaunix.net/uid-30254565-id-5637598.html linux内核中链表代码分析---list.h头文件分析(二) 16年2月28日16 ...
- Linux内核中链表实现
关于双链表实现,一般教科书上定义一个双向链表节点的方法如下: struct list_node{ stuct list_node *pre; stuct list_node *next; ElemTy ...
- Linux内核中链表的学习
一.自己学习链表 数组的缺点:(1)数据类型一致:(2)数组的长度事先定好,不能灵活更改. 从而引入了链表来解决数组的这些缺点:(1)结构体解决多数据类型(2)链表的组合使得链表的长度可以灵活设置. ...
- Linux内核【链表】整理笔记(1)
我们都知道Linux内核里的双向链表和学校里教给我们的那种数据结构还是些不一样.Linux采用了一种更通用的设计,将链表以及其相关操作函数从数据本身进行剥离,这样我们在使用链表的时候就不用自己去实现诸 ...
- Linux内核中双向链表的经典实现
概要 前面一章"介绍双向链表并给出了C/C++/Java三种实现",本章继续对双向链表进行探讨,介绍的内容是Linux内核中双向链表的经典实现和用法.其中,也会涉及到Linux内核 ...
- Linux内核中的GPIO系统之(3):pin controller driver代码分析
一.前言 对于一个嵌入式软件工程师,我们的软件模块经常和硬件打交道,pin control subsystem也不例外,被它驱动的硬件叫做pin controller(一般ARM soc的datash ...
- Linux内核中流量控制
linux内核中提供了流量控制的相关处理功能,相关代码在net/sched目录下:而应用层上的控制是通过iproute2软件包中的tc来实现, tc和sched的关系就好象iptables和netfi ...
- Linux内核中SPI/I2c子系统剖析
Linux内核中,SPI和I2C两个子系统的软件架构是一致的,且Linux内核的驱动模型都以bus,driver,device三种抽象对象为基本元素构建起来.下文的分析将主要用这三种抽象对象的创建过程 ...
随机推荐
- Go语言【第十三篇】:Go语言递归函数
Go语言递归函数 递归,就是在运行的过程中调用自己,语法格式如下: func recursion() { recursion() /* 函数调用自身 */ } func main() { recurs ...
- Linux特殊字符含义
文件名以 ' . ' 开头的都是隐藏文件或目录,只需要在文件或目录名前添加 ' . ' 就可以隐藏它 ~ 表示主目录 . 当前目录 . . ...
- 前端开发学习之——dom ready和window onload的区别
1.ready事件是在页面中所有DOM结构已完全加载时执行,监听的是 DomContentload 事件,初始化并解析完成时触发,不需要等待样式表.图片和 iframes 加载完,也就是说当这个事件触 ...
- CentOS 磁盘阵列(raid10)
1.通过mdadm命令进行磁盘阵列部署 mdadm是multiple devices admin的简称,它是Linux下的一款标准的软件 RAID 管理工具 如果没有mdadm命令,通过yum安装一下 ...
- PowerDesigner 建表语句没出现字段描述
填写了Name 还是没有 修改步骤如下:
- Android ListView 中加入CheckBox/RadioButton 选择状态保持、全选、反选实现
最近在一个项目中,需要在ListView的item中加入CheckBox,但是遇到的一个问题是上下滑动的时候如果有选择了的CheckBox,就会出现选择项错误的问题,下面将个人的解决方法总结如下;先说 ...
- HDOJ(HDU).2546 饭卡(DP 01背包)
HDOJ(HDU).2546 饭卡(DP 01背包) 题意分析 首先要对钱数小于5的时候特别处理,直接输出0.若钱数大于5,所有菜按价格排序,背包容量为钱数-5,对除去价格最贵的所有菜做01背包.因为 ...
- 剑桥offer(31~40)
31.题目描述 统计一个数字在排序数组中出现的次数. 思路:找到最低和最高,相减 class Solution { public: int GetNumberOfK(vector<int> ...
- C#学习之泛型
//主函数//主函数里面调用的类都在后面有具体描述 using System; using System.Collections.Generic; using System.Linq; using S ...
- SSH 指定密钥,连接远程服务器。
ssh -i /root/.ssh/private.pem user@192.168.1.100 -p 7744 如上, /root/.ssh/private.pem :密钥文件路径user@192. ...