链表数据结构的定义非常简洁:

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 内核链表使用举例的更多相关文章

  1. linux内核链表分析

    一.常用的链表和内核链表的区别 1.1  常规链表结构        通常链表数据结构至少应包含两个域:数据域和指针域,数据域用于存储数据,指针域用于建立与下一个节点的联系.按照指针域的组织以及各个节 ...

  2. C语言 Linux内核链表(企业级链表)

    //Linux内核链表(企业级链表) #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> ...

  3. 深入分析 Linux 内核链表--转

    引用地址:http://www.ibm.com/developerworks/cn/linux/kernel/l-chain/index.html 一. 链表数据结构简介 链表是一种常用的组织有序数据 ...

  4. Linux 内核链表

    一 . Linux内核链表 1 . 内核链表函数 1.INIT_LIST_HEAD:创建链表 2.list_add:在链表头插入节点 3.list_add_tail:在链表尾插入节点 4.list_d ...

  5. 深入分析 Linux 内核链表

    转载:http://www.ibm.com/developerworks/cn/linux/kernel/l-chain/   一. 链表数据结构简介 链表是一种常用的组织有序数据的数据结构,它通过指 ...

  6. Linux 内核 链表 的简单模拟(2)

    接上一篇Linux 内核 链表 的简单模拟(1) 第五章:Linux内核链表的遍历 /** * list_for_each - iterate over a list * @pos: the & ...

  7. Linux 内核 链表 的简单模拟(1)

    第零章:扯扯淡 出一个有意思的题目:用一个宏定义FIND求一个结构体struct里某个变量相对struc的编移量,如 struct student { int a; //FIND(struct stu ...

  8. linux内核链表的移植与使用

    一.  Linux内核链表为双向循环链表,和数据结构中所学链表类似,具体不再细讲.由于在内核中所实现的函数十分经典,所以移植出来方便后期应用程序中的使用. /********************* ...

  9. [国嵌攻略][108][Linux内核链表]

    链表简介 链表是一种常见的数据结构,它通过指针将一系列数据节点连接成一条数据链.相对于数组,链表具有更好的动态性,建立链表时无需预先知道数据总量,可以随机分配空间,可以高效地在链表中的任意位置实时插入 ...

随机推荐

  1. mvc中使用remote属性来做ajax验证

    mvc中使用remote属性来做ajax验证比較easy : [Remote("Action", "Controller", AdditionalFields ...

  2. 里根上台时国债只占GDP的30%

    学里根是刻舟求剑,关键是钱从哪来 5  里根主要靠借钱,这是冷战红利,美国打完二战国债占了GDP的120%,然后总量就没怎么增加,但战后GDP快速增长,结果国债占GDP的比例连续下降,打越战登月石油危 ...

  3. Fast Flux技术——本质就是跳板,控制多个机器,同一域名指向极多的IP(TTL修改为0),以逃避追踪

    转自:http://ytuwlg.iteye.com/blog/355718 通过病毒邮件和欺诈网站学到的对付网络封锁的好东西:Fast Flux技术 收到一封邮件,引起我的好奇了: 邮件标题是:Ha ...

  4. zzulioj--1831-- 周末出游(vector建图+dfs)

    1831: 周末出游 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 22  Solved: 8 SubmitStatusWeb Board Descr ...

  5. hdoj--2098--分拆素数和(水题)

    分拆素数和 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  6. hdoj--5256--序列变换(lis变形)

    序列变换 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  7. windows tensorflow 版本与升级

    tensorflow 的版本在 1.1.0/1.2.0 之后 api 迎来重大变化,有必要将版本升级到最新的 1.1.0 以上. 1. 使用 upgrade CPU:pip3 install –upg ...

  8. form表单系列中文件上传及预览

    文件上传及预览 Form提交 Ajax 上传文件 时机: 如果发送的[文件]:->iframe, jQurey(),伪Ajax 预览 import os img_path = os.path.j ...

  9. java9新特性-13-增强的 Stream API

    1.使用说明 Java 的 Steam API 是java标准库最好的改进之一,让开发者能够快速运算,从而能够有效的利用数据并行计算.Java 8 提供的 Steam 能够利用多核架构实现声明式的数据 ...

  10. jQuery的一些选择器

    一.基本选择器 1. id选择器(指定id元素) 将id="one"的元素背景色设置为黑色.(id选择器返单个元素) $(document).ready(function () { ...