【nginx源码学习与运用 四】单向链表ngx_list_t

【nginx源码学习与运用】系列博客中的示例代码在csdn的代码托管服务器CODE上,地址https://code.csdn.net/u012819339/nginx_study ,你可以将其自由的下载到本地,或者通过Git来实时获取更新

ngx_list_t说是单向链表,其实是链表和数组的结合体!!! 需仔细体会,链表中会存在不定数量的大小相同的定长数组,我们的节点元素其实是存储在数组中的,当数组被使用完了以后下次push操作会重新申请一个大小相同的数组追加到链表尾部!!


相关结构

ngx_list_t结构,描述整个链表

typedef struct {
    ngx_list_part_t  *last; //指向链表的最后一个数组元素
    ngx_list_part_t   part; //链表的首个数组元素
    size_t            size; //单个数组元素占用空间大小
    ngx_uint_t        nalloc; //表示每个ngx_list_part_t数组的容量
    ngx_pool_t       *pool; //所依附的内存池
} ngx_list_t;

ngx_list_part_t结构,描述链表的首个数组元素

struct ngx_list_part_s {
    void             *elts; //指向数组起始地址
    ngx_uint_t        nelts; //表示数组中已经使用了多少个元素,小于nalloc
    ngx_list_part_t  *next; //下一个链表元素ngx_list_part_t的地址
};

结构图

ngx_list_t 内存分布

这里写图片描述

操作方法

nginx的单项链表的操作方法比较少

函数解释
ngx_list_create创建并初始化含有一个数组的链表,该数组元素有n个元素,每个成元素用size大小的空间
ngx_list_push向后移动一个元素位置,用于存储元素信息,(如果当前数组使用已满,则会向内存池申请一个数组元素并追加到链表尾部,这个数组元素和链表首部数组大小相同),返回用于存储元素的地址

使用方法与注意事项

1.ngx_list_create初始化一个链表,向内存池预先申请一定的数组存储空间,但当前并没有开始使用链表
2.ngx_list_push每做一次push,链表就会腾出一个空间来存储元素,如果当前链表数组存储空间已满,则会向内存池再次申请一个同样大小的数组空间
3. nginx没有提供list的遍历函数,但是nginx有推荐的遍历链表的方式,看如下代码片段:

/*
 *
 *  the iteration through the list:
 *
 *  part = &list.part;
 *  data = part->elts;
 *
 *  for (i = 0 ;; i++) {
 *
 *      if (i >= part->nelts) {
 *          if (part->next == NULL) {
 *              break;
 *          }
 *
 *          part = part->next;
 *          data = part->elts;
 *          i = 0;
 *      }
 *
 *      ...  data[i] ...
 *
 *  }
 */

示例代码

arvik将nginx中的部分基础结构代码提出来了,好作为新手学习练习使用。见 https://code.csdn.net/u012819339/nginx_study
main.c

/*
blog:   http://blog.csdn.net/u012819339
email:  1216601195@qq.com
author: arvik
*/

#include <stdio.h>
#include <string.h>
#include "ak_core.h"
#include "pt.h"

struct node_s
{
    int index;
    char *name;
};

char *type_name[] = 
{
    "jame",
    "arvik",
    "rose",
    "tom",
    "jack"
};

int main()
{
    ngx_pool_t *p;
    struct node_s *s1, *s2;
    int i = 0;

    p = ngx_create_pool(1000); 
    if(p == NULL)
        return -1;

    ngx_list_t *my_list = ngx_list_create(p, 3, sizeof(struct node_s));
    if(my_list == NULL)
        return -1;

    for(i=0; i<5; i++)
    {
        s2 = ngx_list_push(my_list);  //童鞋们在此思考一下,此处每次push之后,链表的总长度为多少?实际使用长度为多少? 
        s2->name = type_name[i];
        s2->index = i;
    }

    PT_Info("list ele info:\n");
    //nginx推荐的遍历操作方法
    ngx_list_part_t *part = &my_list->part;
    s1 = (struct node_s *)part->elts;
    for( i = 0; ; i++)
    {
        if(i >= part->nelts)
        {
            if(part->next == NULL)
                break;

            part = part->next;
            s1 = part->elts;
            i = 0;
        }

        PT_Info("ele name:%s    index:%d\n", s1[i].name, s1[i].index );
    }

    ngx_destroy_pool(p);
}

运行结果

截图如下:
这里写图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 Nginx 中安装 ngx_http_mp4_module 模块,需要按照以下步骤进行操作: 1. 确认 Nginx 是否支持 ngx_http_mp4_module 模块 首先需要确认 Nginx 是否支持 ngx_http_mp4_module 模块,可以使用以下命令查看 Nginx 是否已经编译了该模块: ``` nginx -V 2>&1 | grep -o with-http_mp4_module ``` 如果输出结果为 with-http_mp4_module,则说明 Nginx 已经编译了 ngx_http_mp4_module 模块;如果输出结果为空,则说明 Nginx 没有编译该模块。 2. 下载 ngx_http_mp4_module 模块 如果 Nginx 没有编译 ngx_http_mp4_module 模块,需要下载该模块并添加到 Nginx 中。可以从 Github 上下载该模块,链接为:https://github.com/kaltura/nginx-vod-module。 可以使用以下命令将 ngx_http_mp4_module 模块下载到 /opt 目录下: ``` cd /opt git clone https://github.com/kaltura/nginx-vod-module.git ``` 3. 编译 Nginx 并添加 ngx_http_mp4_module 模块 在编译 Nginx 时需要添加 --add-module=/opt/nginx-vod-module 参数来指定 ngx_http_mp4_module 模块所在的目录,具体命令如下: ``` ./configure --prefix=/usr/local/nginx --add-module=/opt/nginx-vod-module make make install ``` 4. 配置 NginxNginx 的配置文件中添加以下内容,即可使用 ngx_http_mp4_module 模块: ``` location /video/ { mp4; mp4_buffer_size 1m; mp4_max_buffer_size 5m; } ``` 其中,/video/ 是视频文件所在的目录。mp4 是 ngx_http_mp4_module 模块提供的指令,表示该目录下的文件都是 MP4 格式的视频文件。 mp4_buffer_size 和 mp4_max_buffer_size 是 ngx_http_mp4_module 模块提供的两个参数,用于控制视频文件的缓存大小。 5. 重启 Nginx 完成以上步骤后,需要重启 Nginx 使配置生效: ``` nginx -s reload ``` 至此,ngx_http_mp4_module 模块安装完成。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值