博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Nginx源码分析系列4:Nginx里的双向链表
阅读量:5742 次
发布时间:2019-06-18

本文共 1717 字,大约阅读时间需要 5 分钟。

hot3.png

花了半个小时看了买的书籍,原理已经掌握,

根据书上写了代码如下:

typedef struct{   u_char* str;   ngx_queue_t qEle;//位置任意   int num;}TestNode;ngx_int_t compTestNode(const ngx_queue_t* a,const ngx_queue_t* b){	TestNode* aNode =ngx_queue_data(a,TestNode,qEle);	TestNode* bNode = ngx_queue_data(b,TestNode,qEle);	return aNode->num > bNode->num;/*	#define ngx_queue_data(a, TestNode, qEle)                                         \        (TestNode*) ((u_char *)a - offsetof(TestNode, qEle))*/}void ngx_queue_test(){	int i=0;	ngx_queue_t queueContainer;	TestNode node[5];	ngx_queue_init(&queueContainer);	for(;i<5;i++)	{		node[i].num = 	i ;	}	//添加节点:	ngx_queue_insert_tail(&queueContainer,&node[0].qEle);	ngx_queue_insert_head(&queueContainer,&node[1].qEle);	ngx_queue_insert_tail(&queueContainer,&node[2].qEle);	ngx_queue_insert_after(&queueContainer,&node[3].qEle);	ngx_queue_insert_tail(&queueContainer,&node[4].qEle);	//开始遍历	ngx_queue_t* q;	for(q=ngx_queue_head(&queueContainer);		q!=ngx_queue_sentinel(&queueContainer);		q=ngx_queue_next(q))	{		TestNode* eleNode = ngx_queue_data(q,TestNode,qEle);		printf("%d\n",eleNode->num);	}		//排序	ngx_queue_sort(&queueContainer,compTestNode);		//开始遍历	for(q=ngx_queue_head(&queueContainer);		q!=ngx_queue_sentinel(&queueContainer);		q=ngx_queue_next(q))	{		TestNode* eleNode = ngx_queue_data(q,TestNode,qEle);		printf("%d\n",eleNode->num);	}		}

其实主要思想总结起来就是以下几点:

1任何数据结构体,里面必需有一个ngx_queue_t变量。

2提供结构体的类型,成员的名字,结构体里的ngx_queue_t变量的指针

可以还原处结构体的首地址出来。这个学过C的都知道了。

3 真正链接在双向链表里的是每个结构体里的ngx_queue_t变量。

4 为了排序,自己要写一个排序函数。

 

后面就不说了,比较简单的东西,自己领悟吧小伙伴们!

头发长了,要去理发+吃晚餐,周末就这么没鸟。

PS:我一直在想这链接起来的链表是什么样的。

哈哈,感觉就是电线杆上的一排鸟,每只鸟的周围是2个翅膀张开。

你要是看懂了这句话,说明你已经懂了NGINX里的双向链表的真谛了。

BIG CON!

 

 

转载于:https://my.oschina.net/qiangzigege/blog/182497

你可能感兴趣的文章
centos7安装mysql视频教程_centos7安装mysql(完整)
查看>>
php图片赋值,php如何优雅地赋值
查看>>
dz.27z.co index.php,dz7.2 伪静态规则
查看>>
如何解决OutOfMemoryError
查看>>
【探索HTML5第二弹01】HTML5的前世今生以及来世
查看>>
Failed to connect to remote VM. Connection refused. Connection refused: connect
查看>>
freeze
查看>>
JS时间转时间戳,时间戳转时间。时间显示模式。
查看>>
SAP HANA存储过程结果视图调用
查看>>
设计模式 ( 十八 ):State状态模式 -- 行为型
查看>>
OracleLinux安装说明
查看>>
nova分析(7)—— nova-scheduler
查看>>
hive 权限:Authorization failed:No privilege 'Create' found for outputs .
查看>>
HDU1007 Quoit Design
查看>>
Memcached安装
查看>>
MVVM中的命令绑定及命令参数
查看>>
python Gunicorn
查看>>
Entity Framework 实体框架的形成之旅--Code First模式中使用 Fluent API 配置(6)
查看>>
Spring.net 学习笔记之ASP.NET底层架构
查看>>
I.MX6 wpa_cli 使用
查看>>