前一篇文章讨论了list_head 结构的基本结构和实现原理,本文主要介绍一下实例代码。

自己如果想在应用程序中使用list_head 的相应操作(当然应该没人使用了,C++ STL提供了list 用起来貌似更方便), 在应用程序中需要包含自己的 "list.h" 头文件:

/*
注:这个list.h 是为了配合示例程序而建的,内容来自:linux/include/linux/list.h 和相关文件
*/
#ifndef _LINUX_LIST_H
#define _LINUX_LIST_H struct list_head {
struct list_head *next, *prev;
}; #define LIST_HEAD_INIT(name) { &(name), &(name) } #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) #define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );}) static inline void INIT_LIST_HEAD(struct list_head *list)
{
list->next = list;
list->prev = list;
} 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;
} static inline void list_add(struct list_head *new, struct list_head *head)
{
__list_add(new, head, head->next);
} static inline void __list_del(struct list_head * prev, struct list_head * next)
{
next->prev = prev;
prev->next = next;
} static inline void list_del(struct list_head *entry)
{
__list_del(entry->prev, entry->next);
entry->next = NULL;
entry->prev = NULL;
} #define prefetch(x) __builtin_prefetch(x) //注:这里prefetch 是gcc的一个优化,也可以不要
#define list_for_each(pos, head) \
for (pos = (head)->next; prefetch(pos->next), pos != (head); \
pos = pos->next) #define list_entry(ptr, type, member) \
container_of(ptr, type, member) #endif

写了一个简单的应用程序:

#include "list.h"
#include <stdio.h>
#include <string.h> #define MAX_NAME_LEN 32
#define MAX_ID_LEN 10 typedef struct stud
{
struct list_head list;
char name[MAX_NAME_LEN];
char stu_number[MAX_ID_LEN];
}num_n_stu; int main(void)
{
struct list_head head;
num_n_stu stu_1;
num_n_stu stu_2;
num_n_stu *entry; struct list_head *p;
INIT_LIST_HEAD(&head);
strcpy(stu_1.name,"lisi");
strcpy(stu_1.stu_number,"10000000"); strcpy(stu_2.name,"zhangsan");
strcpy(stu_2.stu_number,"10000001");
list_add(&stu_1.list,&head);
list_add(&stu_2.list,&head);
list_del(&stu_2.list);
list_for_each(p,&head)
{
entry=list_entry(p,struct stud,list);
printf("name: %s\n",entry->name);
printf("stu_number: %s\n",entry->stu_number);
}
list_del(&stu_1.list);
return 0;
}

在Linux内核中可以使用这个以类似驱动模块的形式加载到内核:(这里就不用使用自定义的list.h了)

#include <linux/list.h>
#include <linux/init.h>
#include <linux/module.h> MODULE_LICENSE("GPL"); #define MAX_NAME_LEN 32
#define MAX_ID_LEN 10 typedef struct stud
{
struct list_head list;
char name[MAX_NAME_LEN];
char stu_number[MAX_ID_LEN];
}num_n_stu; static int my_main(void)
{ struct list_head head;
num_n_stu stu_1;
num_n_stu stu_2;
num_n_stu *entry; struct list_head *p;
INIT_LIST_HEAD(&head); strcpy(stu_1.name,"lisi");
strcpy(stu_1.stu_number,"10000000"); strcpy(stu_2.name,"zhangsan");
strcpy(stu_2.stu_number,"10000001"); list_add(&stu_1.list,&head);
list_add(&stu_2.list,&head); list_del(&stu_2.list); list_for_each(p,&head)
{ entry=list_entry(p,struct stud,list); printk("name: %s\n",entry->name); printk("stu_number: %s\n",entry->stu_number); } list_del(&stu_1.list); return 0; } static void my_exit(void)
{
printk("my_exit ! \n");
} module_init(my_main);
module_exit(my_exit);

最新文章

  1. SQL表旋转
  2. JavaScript案例六:简单省市联动(NBA版)
  3. modeler与activiti进行整合
  4. canvas 下载
  5. js下拉菜单默认值为当前年份,下拉菜单的选项为当前年份往前推5年
  6. Delphi资源文件(全面分析之位图、光标、图标、AVI、JPEG、Wave)
  7. (2)Deep Learning之线性单元和梯度下降
  8. bzoj2442[Usaco2011 Open]修剪草坪 单调队列优化dp
  9. mssql sqlserver with cte表达式(递归)找出最顶值的方法分享
  10. npm run build 打包后,如何运行在本地查看效果(Nginx服务)
  11. 修改maven镜像为阿里云,速度快
  12. python windows环境下文档备份
  13. 2.16 C++类与new和delete操作符
  14. Alpine Linux 使用简介
  15. Python对Selenium调用浏览器进行封装包括启用无头浏览器,及对应的浏览器配置文件
  16. Airtest 网易 UI 自动化工具 Airtest 浅用记录
  17. 高可用(HA)架构
  18. Linux下Apache网站目录读写权限的设置
  19. 深圳MPD大会,五大专题一会尽享
  20. spring boot和mybatis集成分页插件

热门文章

  1. INSPIRED启示录 读书笔记 - 第31章 苹果公司给我的启示
  2. poj 2186 Popular Cows 【强连通分量Tarjan算法 + 树问题】
  3. Linux操作系统的安装以及基本的操作命令详解
  4. 【P2052】道路修建(树形+搜索)
  5. dependencies devDependencies peerDependencies optionalDependencies区别
  6. 如何使用REST请求风格
  7. RGB(16进制)_转_TColor
  8. 多线程下使用Jedis
  9. 解决CentOS 6环境时区、日期、时间同步方法
  10. mac 不再接受预览版提示