练习一下linux中的list函数。
所有的list函数见 include/linux/list.h
自己从 include/linux/list.h 拷贝了一些函数到自己的list.c中, 然后练习了一下。
没有别的目的,就是想熟练一下。毕竟linux内核代码中试用了大量的list函数。
list的函数太方便使用了。
文件:list.c
- #include <stdio.h>
- // #include <linux/list.h>
- struct list_head {
- struct list_head *next, *prev;
- };
- #define LIST_HEAD_INIT(name) { &(name), &(name) }
- #define LIST_HEAD(name) \
- struct list_head name = LIST_HEAD_INIT(name)
- 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) //ËüÖ»Êǽ«newÌí¼Óµ½prevºÍnextÖ®¼ä
- {
- next->prev = new;
- new->next = next;
- new->prev = prev;
- prev->next = new;
- }
- static inline void list_add_tail(struct list_head *new, struct list_head *head)
- {
- __list_add(new, head->prev, head);
- }
- static inline int list_empty(const struct list_head *head)
- {
- return head->next == head;
- }
- #undef offsetof
- #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
- /**
- * * container_of - cast a member of a structure out to the containing structure
- * * @ptr: the pointer to the member.
- * * @type: the type of the container struct this is embedded in.
- * * @member: the name of the member within the struct.
- * *
- * */
- #define container_of(ptr, type, member) ({ \
- const typeof( ((type *))->member ) *__mptr = (ptr); \
- (type *)( (char *)__mptr - offsetof(type,member) );})
- #define list_entry(ptr, type, member) \
- container_of(ptr, type, member)
- /**
- * * list_for_each_entry - iterate over list of given type
- * * @pos: the type * to use as a loop cursor.
- * * @head: the head for your list.
- * * @member: the name of the list_struct within the struct.
- * */
- #define list_for_each_entry(pos, head, member) \
- for (pos = list_entry((head)->next, typeof(*pos), member); \
- &pos->member != (head); \
- pos = list_entry(pos->member.next, typeof(*pos), member))
- #define list_for_each(pos, head) \
- for (pos = (head)->next; pos != (head); pos = pos->next)
- struct devlist {
- struct list_head list;
- char * name;
- };
- struct devlist dev0 = {
- .list = LIST_HEAD_INIT(dev0.list),
- .name = NULL,
- };
- /* static initiate head list*/
- // LIST_HEAD(hl);
- struct list_head hl = LIST_HEAD_INIT(hl);
- void main(void) {
- /* dynamic initiate head list. */
- INIT_LIST_HEAD(&hl);
- struct list_head *l;
- struct devlist * pdev = NULL;
- int empty = list_empty(&hl);
- if(empty)
- printf("the device list is empty!\n");
- struct devlist dev1;
- dev1.name = "device1";
- list_add_tail(&dev1.list, &hl);
- struct devlist edev1 = {{}, "entry device1"};
- list_add_tail(&edev1.list, &dev0.list);
- struct devlist dev2 = {{}, "device2"};
- list_add_tail(&dev2.list, &hl);
- struct devlist edev2 = {{}, "entry device2"};
- list_add_tail(&edev2.list, &dev0.list);
- empty = list_empty(&hl);
- if(!empty)
- printf("the device list is not empty!\n");
- list_for_each_entry(pdev, &dev0.list, list){
- printf("the device name is %s\n", pdev->name);
- }
- list_for_each(l, &hl) {
- // for (l = (&hl)->next; l != (&hl); l = l->next){
- // printf("l is: %p, head is: %p \n", l, &hl);
- pdev = list_entry(l, typeof(dev0), list);
- printf("the device name is %s\n", pdev->name);
- }
- }
输出结果:
- $ ./list
- the device list is empty!
- the device list is not empty!
- the device name is entry device1
- the device name is entry device2
- the device name is device1
- the device name is device2
练习一下linux中的list函数。的更多相关文章
- 深入解析Linux中的fork函数
1.定义 #include <unistd.h> #include<sys/types.h> pid_t fork( void ); pid_t 是一个宏定义,其实质是int, ...
- 如何测试Linux 中的wait函数能不能等待子进程的子进程?
#include <stdio.h> #include <stdlib.h> int main() { pid_t pid = fork(); switch(pid) { : ...
- [fork]Linux中的fork函数详解
---------------------------------------------------------------------------------------------------- ...
- 关于linux中的system函数
Linux下使用system()函数一定要谨慎 https://blog.csdn.net/senen_wakk/article/details/51496322 system()正确应用 https ...
- Linux中的入口函数main
main()函数,想必大家都不陌生了,从刚开始写程序的时候,大家便开始写main(),我们都知道main是程序的入口.那main作为一个函数,又是谁调用的它,它是怎么被调用的,返回给谁,返回的又是什么 ...
- Linux中的读函数与块高速缓存
为了提高Linux块设备读写的效率,Unix会在内存中建立块高速缓存,块高速缓存存储了系统最近读的数据块和刚刚写入的数据块,也就是说IO访问其实是和块高速缓存打交道的(直接IO除外),块高速缓存会适时 ...
- Unix/Linux中的fork函数
fork函数介绍 一个现有进程可以调用fork函数创建一个新进程.该函数定义如下: #include <unistd.h> pid_t fork(void); // 返回:若成功则在子进程 ...
- linux中内核延时函数 (转)
第一类延时函数原型是:(忙等) void ndelay(unsigned long nsecs); void udelay(unsigned long usecs); void mdelay(unsi ...
- linux中字符串转换函数 simple_strtoul【转】
转自:http://blog.csdn.net/tommy_wxie/article/details/7480087 Linux内核中提供的一些字符串转换函数: lib/vsprintf.c [htm ...
随机推荐
- Flink Program Guide (9) -- StateBackend : Fault Tolerance(Basic API Concepts -- For Java)
State Backends 本文翻译自文档Streaming Guide / Fault Tolerance / StateBackend ----------------------------- ...
- 《pigcms v6.2最新完美至尊版无任何限制,小猪微信源码多用户微信营销服务平台系统》
<pigcms v6.2最新完美至尊版无任何限制,小猪微信源码多用户微信营销服务平台系统> 前两天分享了套小猪CMS(PigCms)多用户微信营销服务平台系统V6.1完美破解至尊版带微用户 ...
- ubuntu下lnmp的安装
适用于ubuntu14.04和源是14.04的ubuntu上安装nginx(我学在线Moodle工作室---注这里安装的是最新版的nginx,并且解决pathinfo问题,特别适用于Moodle安装) ...
- 开源代码——Crouton
开源代码——Crouton 一个可随意定位置的带色Toast——开源代码Crouton的简单使用 今天在公司要求的代码中,要求显示的提示能够更加具有多样化,而不是简单的Toast字样,第一想法肯定 ...
- 超轻量级高性能ORM数据访问组件Deft,比dapper快20%以上
超轻量级高性能ORM数据访问组件Deft,比dapper快20%以上 阅读目录 Deft简介 Deft 核心类介绍 Deft 3分钟即可上手使用 其他可选的配置参数 性能测试 Demo代码下载 回到顶 ...
- 安卓使用spinner控件和pull解析实现全国省市县的三级联动
实现该功能主要有两个难点: 1.XML文件的Pull解析.由于XML文件的结构较为复杂,所以解析时要注意,划分XML文件的结构,根据结构建立相应的和集合.本例中需要建立三个类和三个对象.三个类分别为, ...
- 普林斯顿大学算法课 Algorithm Part I 学习资源
网友笔记参考 果壳Mooc首页 revilwang的专栏 白色咖啡 Weiran Liu的渣技术小专栏 Bug表:http://findbugs.sourceforge.net/bugDescript ...
- Mac 下 Chrome 快捷键大全
1. 标签页和窗口快捷键 ⌘-N 打开新窗口. ⌘-T 打开新标签页. ⌘-Shift-N 在隐身模式下打开新窗口. 按 ⌘-O,然后选择文件. 在 Chrome 浏览器中打开计算机中的文件. 按住 ...
- 原生网络请求以及AFN网络请求/异步下载
这里对网络请求方式做一个总结. 原生方式同步GET请求: NSString *urlStr = @"http://apis.juhe.cn/mobile/get?phone=13429667 ...
- 数据挖掘(七):Apriori算法:频繁模式挖掘
1 算法思想 算法使用频繁项集性质的先验知识.Apriori使用一种称作逐层搜索的迭代方法,k项集用于探索(k+1)项集.首先,通过扫描数据库,累积每个项的计数,并收集满足最小支持度的项,找出频繁1项 ...