Linux 内核链表使用举例
链表数据结构的定义非常简洁:
struct list_head {
struct list_head *next, *prev;
};
list_head结构包括两个指向list_head结构的指针prev和next。该内核链表具备双链表功能。通常它都组织成双循环链表,这里的list_head没有数据域。在Linux内核链表中,不是在链表结构中包括数据,而是在数据结构中包括链表节点。以下是一个简单的内核模块的样例。包括了对链表进行插入、删除、遍历的一些函数:
list.c:
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/string.h>
#include <linux/spinlock.h>
#include <linux/list.h> typedef struct list_test_struct {
int num;
struct list_head list;
}test; struct list_head head_list;
rwlock_t list_lock = RW_LOCK_UNLOCKED; //定义读写锁,操作前加锁,操作后解锁 void creat_list(void)
{
test *s = NULL;
int i = 0;
for (i = 0; i < 10; i++)
{
s = (test *)kmalloc(sizeof(test), GFP_ATOMIC);
if (!s) return ;
s->num = i;
write_lock(&list_lock);
list_add_tail(&(s->list), &head_list); //加入节点
write_unlock(&list_lock);
}
} void del_data(void)
{
test *s;
struct list_head *p; write_lock(&list_lock);
list_for_each(p, &head_list) //遍历链表
{
s = list_entry(p, test, list);
if (s->num == 4)
{
list_del(p); //删除节点
write_unlock(&list_lock);
return ;
}
}
write_unlock(&list_lock);
} void print_list(void)
{
test *s;
struct list_head *p;
read_lock(&list_lock);
list_for_each(p, &head_list)
{
s = list_entry(p, test, list);
printk(KERN_INFO"%d\n", s->num);
}
read_unlock(&list_lock);
} int list_test_init(void)
{
INIT_LIST_HEAD(&head_list);
creat_list();
print_list();
del_data();
print_list();
return 0;
} void list_test_exit(void)
{
return;
} MODULE_LICENSE("GPL");
module_init(list_test_init);
module_exit(list_test_exit);
Makefile:
obj-m += list.o KERN_DIR = /usr/src/linux-headers-2.6.32-33-generic all:
make -C $(KERN_DIR) M=`pwd` modules clean:
make -C $(KERN_DIR) M=`pwd` modules clean
rm -rf modules.order
make后生成module,获取超级用户权限后
insmod list.ko
然后输入命令:
cat var/log/messages
printk信息打印:
Jun 20 16:26:01 wuwen-laptop kernel: [ 5490.274551] 0
Jun 20 16:26:01 wuwen-laptop kernel: [ 5490.274553] 1
Jun 20 16:26:01 wuwen-laptop kernel: [ 5490.274555] 2
Jun 20 16:26:01 wuwen-laptop kernel: [ 5490.274555] 3
Jun 20 16:26:01 wuwen-laptop kernel: [ 5490.274556] 4
Jun 20 16:26:01 wuwen-laptop kernel: [ 5490.274557] 5
Jun 20 16:26:01 wuwen-laptop kernel: [ 5490.274558] 6
Jun 20 16:26:01 wuwen-laptop kernel: [ 5490.274559] 7
Jun 20 16:26:01 wuwen-laptop kernel: [ 5490.274559] 8
Jun 20 16:26:01 wuwen-laptop kernel: [ 5490.274560] 9
Jun 20 16:26:01 wuwen-laptop kernel: [ 5490.274561] 0
Jun 20 16:26:01 wuwen-laptop kernel: [ 5490.274562] 1
Jun 20 16:26:01 wuwen-laptop kernel: [ 5490.274563] 2
Jun 20 16:26:01 wuwen-laptop kernel: [ 5490.274564] 3
Jun 20 16:26:01 wuwen-laptop kernel: [ 5490.274564] 5
Jun 20 16:26:01 wuwen-laptop kernel: [ 5490.274565] 6
Jun 20 16:26:01 wuwen-laptop kernel: [ 5490.274566] 7
Jun 20 16:26:01 wuwen-laptop kernel: [ 5490.274567] 8
Jun 20 16:26:01 wuwen-laptop kernel: [ 5490.274568] 9
第二次输出发现节点4被删除。在这里实现:
list_for_each(p, &head_list) //遍历链表
{
s = list_entry(p, test, list);
if (s->num == 4)
{
list_del(p); //删除节点
write_unlock(&list_lock);
return ;
}
}
Linux 内核链表使用举例的更多相关文章
- linux内核链表分析
一.常用的链表和内核链表的区别 1.1 常规链表结构 通常链表数据结构至少应包含两个域:数据域和指针域,数据域用于存储数据,指针域用于建立与下一个节点的联系.按照指针域的组织以及各个节 ...
- C语言 Linux内核链表(企业级链表)
//Linux内核链表(企业级链表) #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> ...
- 深入分析 Linux 内核链表--转
引用地址:http://www.ibm.com/developerworks/cn/linux/kernel/l-chain/index.html 一. 链表数据结构简介 链表是一种常用的组织有序数据 ...
- Linux 内核链表
一 . Linux内核链表 1 . 内核链表函数 1.INIT_LIST_HEAD:创建链表 2.list_add:在链表头插入节点 3.list_add_tail:在链表尾插入节点 4.list_d ...
- 深入分析 Linux 内核链表
转载:http://www.ibm.com/developerworks/cn/linux/kernel/l-chain/ 一. 链表数据结构简介 链表是一种常用的组织有序数据的数据结构,它通过指 ...
- Linux 内核 链表 的简单模拟(2)
接上一篇Linux 内核 链表 的简单模拟(1) 第五章:Linux内核链表的遍历 /** * list_for_each - iterate over a list * @pos: the & ...
- Linux 内核 链表 的简单模拟(1)
第零章:扯扯淡 出一个有意思的题目:用一个宏定义FIND求一个结构体struct里某个变量相对struc的编移量,如 struct student { int a; //FIND(struct stu ...
- linux内核链表的移植与使用
一. Linux内核链表为双向循环链表,和数据结构中所学链表类似,具体不再细讲.由于在内核中所实现的函数十分经典,所以移植出来方便后期应用程序中的使用. /********************* ...
- [国嵌攻略][108][Linux内核链表]
链表简介 链表是一种常见的数据结构,它通过指针将一系列数据节点连接成一条数据链.相对于数组,链表具有更好的动态性,建立链表时无需预先知道数据总量,可以随机分配空间,可以高效地在链表中的任意位置实时插入 ...
随机推荐
- HDU 3016 Man Down(线段树)
HDU 3016 Man Down 题目链接 题意:是男人就下100层的游戏的简单版,每次仅仅能从两端下落.求落地最大血量 思路:利用线段树能够处理出每一个线段能来自哪几个线段.然后就是dag最长路了 ...
- Logical Operators (Transact-SQL)
https://docs.microsoft.com/en-us/sql/t-sql/language-elements/logical-operators-transact-sql Logical ...
- zzulioj--1775-- 和尚特烦恼1——是不是素数(素数水题)
1775: 和尚特烦恼1--是不是素数 Time Limit: 2 Sec Memory Limit: 128 MB Submit: 563 Solved: 193 SubmitStatusWeb ...
- Windows PE 工具
通过大白菜.老毛桃等装机软件,然后制作 U 盘启动工具, 1. 什么是 windows pe 工具 PE(Preinstall Environment),Win pe 全称 Windows Prein ...
- BZOJ 3524主席树裸题 (雾)
思路: 按权值建一棵主席树 (但是这好像不是正解 空间复杂度是不对的--.) //By SiriusRen #include <cstdio> #include <cstring&g ...
- 搭建Hadoop的全分布模式
此教程仅供参考 注意:此文档目的是为了本人方便以后复习,不适合当教程,以免误导萌新... 1.安装三台Linux2.在每台机器上安装JDK3.配置每台机器的免密码登录 (*) 生成每台机器的公钥和私钥 ...
- C# fixed语句固定变量详解
相信很多人在这样或那样的项目中,或者无意间看到了fixed语句块,看到之后你肯定会疑问: 1,这个fixed关键字是做什么用的? 2,什么情况下需要该关键字? 3,这个关键字该怎么用? 我相信解决了上 ...
- Ubuntu14.04下tensorflow安装
自己电脑没装双系统,于是决定在虚拟机里装个tensorflow,以下是安装过程: 1.安装anaconda2 for Linux 官网下的话很慢,去清华的镜像网站下吧,我上一篇文章有网址 安装:bas ...
- 洛谷3388 【模板】割点 tarjan算法
题目描述 给出一个n个点,m条边的无向图,求图的割点. 关于割点 在无向连通图中,如果将其中一个点以及所有连接该点的边去掉,图就不再连通,那么这个点就叫做割点(cut vertex / articul ...
- ArchLinux 调节屏幕亮度和音量大小
我使用的是dwm,所以这种琐碎小事还要我们亲自动手, 以后考虑做个脚本,把声音调节.屏幕亮度什么的统统塞进去 屏幕亮度 # 查看亮度最大值 cat /sys/class/backlight/intel ...