nginx数据结构-ngx_list

本文介绍了Nginx中ngx_list_t的数据结构特点及其操作函数。ngx_list_t是一种特殊的链表实现,其节点为固定大小的数组,支持高效地在链表尾部添加元素。文章详细解释了如何初始化和使用ngx_list_t。

ngx_list_t顾名思义,就像数据结构中的链表,但是它跟我们常见的链表实现的list有什么不同呢?不同点就在于它的节点,它的节点不像我们常见的list的节点,只能存放一个元素,ngx_list_t的节点实际上是一个固定大小的数组。

 

初始化的时候,我们需要设定元素需要占用的空间大小,每个节点数组的容量大小。

添加元素到这个list里面的时候,会在进行尾部插入,给最后的数组上添加元素,但是如果尾部节点的数组存满了,那么必须增加一个新的节点到这个list里面去。


下面我们来具体看一下它的定义,这些定义和相关的操作函数定义在src/core/ngx_list.h和src/core/ngx_list.c文件中。

ngx_list_part_s表示链表中节点数组,ngx_list_s表示链表。


我们来看一下提供的一个操作的函数。

1:ngx_list_t *ngx_list_create(ngx_pool_t*pool, ngx_uint_t n, size_t size);

 

该函数创建一个ngx_list_t类型的对象,并对该list的第一个节点分配存放元素的内存空间。

 

pool: 分配内存使用的pool。

n: 每个节点固定长度的数组的长度。

size: 存放的具体元素的个数。

返回值: 成功返回指向创建的ngx_list_t对象的指针,失败返回NULL。


2:void *ngx_list_push(ngx_list_t *list);    //尾插法

该函数在给定的list的尾部追加一个元素,并返回指向新元素存放空间的指针。如果追加失败,则返回NULL。

 

3:static ngx_inline ngx_int_t  ngx_list_init(ngx_list_t *list, ngx_pool_t*pool, ngx_uint_t n, size_t size);

该函数是用于ngx_list_t类型的对象已经存在,但是其第一个节点存放元素的内存空间还未分配的情况下,可以调用此函数来给这个list的首节点来分配存放元素的内存空间。

 

若是ngx_list_t类型的变量,则需要通过调用函数ngx_list_create创建的,用ngx_list_init函数初始化,否则,你往这个list里追加元素就可能引发不可预知的行为,亦或程序会崩溃的哦。。

/opt/nginx-sticky-module-ng-master/ngx_http_sticky_module.c: 在函数‘ngx_http_sticky_header_filter’中: /opt/nginx-sticky-module-ng-master/ngx_http_sticky_module.c:475:63: 错误:‘ngx_http_upstream_headers_in_t’没有名为‘cookies’的成员 if (ngx_http_parse_set_cookie_lines(&r->upstream->headers_in.cookies, &ctx->sticky_conf->cookie_name, &transfer_cookie) == NGX_DECLINED) ^ /opt/nginx-sticky-module-ng-master/ngx_http_sticky_module.c:475:3: 错误:传递‘ngx_http_parse_set_cookie_lines’的第 2 个参数时在不兼容的指针类型间转换 [-Werror] if (ngx_http_parse_set_cookie_lines(&r->upstream->headers_in.cookies, &ctx->sticky_conf->cookie_name, &transfer_cookie) == NGX_DECLINED) ^ In file included from /opt/nginx-sticky-module-ng-master/ngx_http_sticky_module.c:9:0: src/http/ngx_http.h:113:18: 附注:需要类型‘struct ngx_table_elt_t *’,但实参的类型为‘struct ngx_str_t *’ ngx_table_elt_t *ngx_http_parse_set_cookie_lines(ngx_http_request_t *r, ^ /opt/nginx-sticky-module-ng-master/ngx_http_sticky_module.c:475:3: 错误:提供给函数‘ngx_http_parse_set_cookie_lines’的实参太少 if (ngx_http_parse_set_cookie_lines(&r->upstream->headers_in.cookies, &ctx->sticky_conf->cookie_name, &transfer_cookie) == NGX_DECLINED) ^ In file included from /opt/nginx-sticky-module-ng-master/ngx_http_sticky_module.c:9:0: src/http/ngx_http.h:113:18: 附注:在此声明 ngx_table_elt_t *ngx_http_parse_set_cookie_lines(ngx_http_request_t *r,
最新发布
06-24
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值