例说Linux内核链表(三)
经常使用的linux内核双向链表API介绍
linux link list结构图例如以下:
内核双向链表的在linux内核中的位置:/include/linux/list.h
使用双向链表的过程,主要过程包括创建包括struct link_head结构的结构体(item),建立链表头。向链表中加入item(自己定义数据结构。双向链表数据单元)。删除链表节点。遍历链表,判空等。
1、建立自己定义链表数据结构
- struct kool_list{
- int to;
- struct list_head list;
//包括链表头 - int from;
- };//自己定义欲链接的数据额结构。并包括双向链表结构
2、建立链表头
- struct kool_list mylist;
- INIT_LIST_HEAD(&mylist.list);//初始化一个链表表头
或者
static LIST_HEAD(adc_host_head);//初始化一个链表头adc_host_head
另外一种创建链表头和第一种的差别在于,另外一种在编译的时候才会被初始化。
另一点就是链表头是独立的还是位于自己定义链表数据结构中的。就好比在《例说Linux内核链表(二)》中给出的链表结构图和本文给出的结构图的差别。
3、向链表加入item
list_add(struct list_head *new, struct list_head *head);
比如:
- struct kool_list *tmp;
- tmp= (struct kool_list *)malloc(sizeof(struct kool_list));
- printf("enter to and from:");
- scanf("%d %d", &tmp->to, &tmp->from); //初始化数据结构
- /* add the new item 'tmp' to the list of items in mylist */
- list_add(&(tmp->list), &(mylist.list));//项链表中加入新的元素节点,tmp中的list
list_add_tail(struct list_head *new, struct list_head *head);
在链表的尾部加入一个item,和list_add的差别在于,list_add把新的item加到了链表头的后面,list_add_tail把item加到了链表头的前面。
4、遍历链表
list_for_each_entry(type *cursor, struct list_head *list, member)
这并非一个函数。它是一个for循环,依次列出要遍历的链表。三个元素代表的意义:type *cursor代表item的指针,struct list_head *list是链表头,member是item中包括的list_head数据项。
通过这三个数据能够定位到链表的每个数据元素。当中定位原理就是结构体偏移。
比如:
- list_for_each_entry(tmp, &mylist.list, list)
- printf("to= %d from= %d\n", tmp->to, tmp->from);
这个宏能够分为两步,第一步是遍历链表,pos依次指向链表中每一个item的struct
list_head 结构,第二步是获取pos指向的struct list_head所在的item。
这里是tmp 。
list_for_each(pos, &mylist.list){//遍历链表,pos依次指向链表的元素
tmp= list_entry(pos, struct kool_list, list);//获得包括pos节点的数据结构指针
5、删除
删除链表中的某节点,首先要使用安全遍历,然后再删除。
比如:
- list_for_each_safe(pos, q, &mylist.list){
- tmp= list_entry(pos, struct kool_list, list);
- printf("freeing item to= %d from= %d\n", tmp->to, tmp->from);
- list_del(pos);
6、链表空
Returns a nonzero value if the given list is empty.
參考站点:http://www.makelinux.net/ldd3/chp-11-sect-5
例说Linux内核链表(三)的更多相关文章
- 例说Linux内核链表(一)
介绍 众所周知,Linux内核大部分是使用GNU C语言写的.C不同于其它的语言,它不具备一个好的数据结构对象或者标准对象库的支持. 所以能够借用Linux内核源代码树的循环双链表是一件非常值得让人高 ...
- 深入分析 Linux 内核链表--转
引用地址:http://www.ibm.com/developerworks/cn/linux/kernel/l-chain/index.html 一. 链表数据结构简介 链表是一种常用的组织有序数据 ...
- linux内核链表分析
一.常用的链表和内核链表的区别 1.1 常规链表结构 通常链表数据结构至少应包含两个域:数据域和指针域,数据域用于存储数据,指针域用于建立与下一个节点的联系.按照指针域的组织以及各个节 ...
- 深入分析 Linux 内核链表
转载:http://www.ibm.com/developerworks/cn/linux/kernel/l-chain/ 一. 链表数据结构简介 链表是一种常用的组织有序数据的数据结构,它通过指 ...
- Linux 内核链表的使用及深入分析【转】
转自:http://blog.csdn.net/BoArmy/article/details/8652776 1.内核链表和普通链表的区别 内核链表是一个双向链表,但是与普通的双向链表又有所区别.内核 ...
- Linux内核链表——看这一篇文章就够了
本文从最基本的内核链表出发,引出初始化INIT_LIST_HEAD函数,然后介绍list_add,通过改变链表位置的问题引出list_for_each函数,然后为了获取容器结构地址,引出offseto ...
- Linux 内核 链表 的简单模拟(1)
第零章:扯扯淡 出一个有意思的题目:用一个宏定义FIND求一个结构体struct里某个变量相对struc的编移量,如 struct student { int a; //FIND(struct stu ...
- linux内核链表的移植与使用
一. Linux内核链表为双向循环链表,和数据结构中所学链表类似,具体不再细讲.由于在内核中所实现的函数十分经典,所以移植出来方便后期应用程序中的使用. /********************* ...
- linux内核链表的使用
linux内核链表:链表通常包括两个域:数据域和指针域.struct list_head{struct list_head *next,*prev;};include/linux/list.h中实现了 ...
随机推荐
- thinkphp实现多数据库操作
这篇文章主要介绍了ThinkPHP实现多数据库连接的解决方法,需要的朋友可以参考下 ThinkPHP实现连接多个数据的时候,如果数据库在同一个服务器里的话只需要这样定义模型: ? 1 2 3 cl ...
- [Algorithm]扔杯问题
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- GStreamer基础教程01 - Hello World
摘要 在面对一个新的软件库时,第一步通常实现一个“hello world”程序,来了解库的用法.对于GStreamer,我们可以实现一个极简的播放器,来了解GStreamer的使用. 环境配置 为了快 ...
- 如何用ajax写分页查询(以留言信息为例)-----2017-05-17
要写分页,首先你得清楚,一页你想显示多少条信息?如何计算总共显示的页数? 先说一下思路: (1)从数据库读取数据,以chenai表为例,读取所有留言信息.并能够实现输入发送者,可以查询该发送者的留言总 ...
- awk杂集-20170911
awk 格式 1.awk -F '分割符' 'BEGIN{} /执行条件/{} END{}' filepath; 默认使用空格分割 2.awk -v word=$command '{print wor ...
- Android View事件分发与传递
在Android中,人们主要通过手指与系统交互.Android把所有的touch事件都被封装成MotionEvent来进行处理,其中包括了手指点击的位置,时间等信息.其事件类型主要包括:ACTION_ ...
- Android Material Design之CollapsingToolbarLayout使用
CollapsingToolbarLayout作用是提供了一个可以折叠的Toolbar,它继承至FrameLayout,给它设置layout_scrollFlags,它可以控制包含在Collapsin ...
- RN打包的那些坑儿
Write By lz: Lz 寄语: RN虐我千百遍, 我待RN如初恋, 坑儿爬多了也就自然了 官方文档: http://reactnative.cn/docs/0.43/signed-apk-an ...
- 修复lsp,360浏览器可以上网其它软件不行
netsh winsock reset netsh int ip reset 重启电脑
- 解决启动httpd报: apr_sockaddr_info_get() failed for错误
我测试库里 service httpd start 时报 下面错误 httpd: apr_sockaddr_info_get() failed for fengxin.wzjzt.centoshttp ...