Nginx中封装的数据结构

Nginx中封装的数据结构

  • Nginx中封装的数据结构
    • 整型
    • ngx_str_t【字符串】
    • ngx_list_t【链表】
    • ngx_table_elt_t【key/value】
    • ngx_buf_t
    • ngx_chain_t

Nginx中封装的数据结构

整型

typedef intptr_t        ngx_int_t;
typedef uintptr_t       ngx_uint_t;

ngx_str_t【字符串】

typedef struct {size_t      len; // 表示字符串的有效长度u_char     *data;// 表示字符串起始地址
} ngx_str_t;

ngx_list_t【链表】

typedef struct ngx_list_part_s  ngx_list_part_t;// 表示链表中的一个元素
struct ngx_list_part_s {void             *elts; // 指向数组的起始位置ngx_uint_t        nelts;//  表示数组中已经使用了多少个元素ngx_list_part_t  *next;// 下一个链表元素的地址
};// 存储数组的链表
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_table_elt_t【key/value】

typedef struct ngx_table_elt_s  ngx_table_elt_t;struct ngx_table_elt_s {ngx_uint_t        hash; // 用于快速检索头部ngx_str_t         key; // 名字ngx_str_t         value; // 值u_char           *lowcase_key; // key全是小写ngx_table_elt_t  *next; // 
};

用于存储HTTP头部

ngx_buf_t

typedef void *            ngx_buf_tag_t;typedef struct ngx_buf_s  ngx_buf_t;u_char          *pos;  // 从这个位置开始处理内存中的数据u_char          *last; // 表示有效的内容的结束位置off_t            file_pos;  //  要处理文件的位置off_t            file_last; //  要处理文件的截止位置u_char          *start;         /* start of buffer */  // 要处理内存的起始地址u_char          *end;           /* end of buffer */    // 要处理内存的末尾地址ngx_buf_tag_t    tag;  // 缓冲区的类型,例如由哪个模块使用就指向这个模块变量的地址ngx_file_t      *file;  // 引用的文件类型ngx_buf_t       *shadow;/* the buf's content could be changed */unsigned         temporary:1; // 临时内存标记位,为1时表示数据在内存中且这段内存可以修改/** the buf's content is in a memory cache or in a read only memory* and must not be changed*/unsigned         memory:1; // 标志位,为1时表示数据在内存中且这段内存不可以被修改/* the buf's content is mmap()ed and must not be changed */unsigned         mmap:1; // 标志位,为1时表示这段内存是用mmap系统调用映射过来的,不可以被修改unsigned         recycled:1; // 标志位, 为1表示可回收unsigned         in_file:1; // 标志位,为1表示这段缓冲区处理的是文件而不是内存unsigned         flush:1; // 标志位,为1时表示需要执行flush操作unsigned         sync:1; // 标志位,对操作这块缓冲区是否使用同步方式,unsigned         last_buf:1; // 标志位,表示是否是最后一块缓冲区,因为ngx_buf_t可以由ngx_chain_t链表串联起来unsigned         last_in_chain:1; // 标志位,表示是否是ngx_chain_t中的最后一块缓冲区unsigned         last_shadow:1; // 标志位,表示是否为最后一个影子缓冲区unsigned         temp_file:1; // 标志位,表示当前缓冲区是否属于临时文件/* STUB */ int   num;
};

缓冲区,处理大数据,既用于存储内存数据,也用于存储磁盘数据。

ngx_chain_t

typedef struct ngx_chain_s           ngx_chain_t;struct ngx_chain_s {ngx_buf_t    *buf; // 指向当前的ngx_buf_t缓冲区ngx_chain_t  *next; // 指向下一个ngx_chain_t,如果是最后一个,则为NULL
};

在向用户发送HTTP包体时,就要传入ngx_chain_t链表对象,注意,如果是最后一个ngx_chain_t,那么必须将next置为NULL,否则永远不会发送成功,而且这个请求将一直不会结束

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/38079.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

qt6开发环境配置杂记

很多同学不重视环境配置问题,这是工程问题,实际工作中,如果不真正搞懂环境配置,后期可能会遇到各种坑。 QT是一套开发框架,最终要翻译成c去执行。总体而言,就是下面三张框图: (工程…

Spring底层原理之bean的加载方式一 用XML方式声明bean 自定义bean及加载第三方bean 2024详解

目录 用XML方式声明bean 首先我们创建一个空的java工程 我们要导入一个spring的依赖 注意在maven工程里瞅一眼 我们创建一个业务层接口 还有四个实现类 我们最初的spingboot生命bean的方式是通过xml声明 我们在resources文件夹下创建一个配置文件 我们书写代码 首先初…

AI Agent:技术原理与未来趋势

在人工智能的快速发展中,AI Agent作为一项创新技术,正逐渐成为研究和应用的热点。AI Agent不仅仅是执行命令的程序,它们能够感知环境、做出决策并采取行动,展现出类似人类的群体协作能力。本文将探讨AI Agent的技术原理、开源框架…

使用vite官网和vue3官网分别都可以创建vue3项目

问: npm init vitelatest 和 npm create vuelatest创建的vue3项目有什么区别? 回答: npm init vitelatest 和 npm create vuelatest 分别是使用 Vite 和 Vue CLI 工具创建 Vue 项目的两种方式,它们之间有几个主要区别: 1. **构建工具:** …

【PYG】定义数据集报错AttributeError: can‘t set attribute

当你遇到 AttributeError: cant set attribute 错误时,通常是因为你试图在一个类的实例上设置一个属性,但该类不允许直接设置属性。在Python中,某些类,特别是那些继承自某些基类(比如 torch.utils.data.Dataset&#x…

忍法:声音克隆之术

前言: 最近因为一直在给肚子里面的宝宝做故事胎教,每天(其实是看自己心情抽空讲下故事)都要给宝宝讲故事,心想反正宝宝也看不见我,只听我的声音,干脆偷个懒,克隆自己的声音&#xf…

Linux CentOS 宝塔 Suhosin禁用php5.6版本eval函数详细图文教程

方法一:PHP_diseval_extension禁用 Linux CentOS 禁用php的eval函数详细图文教程_centos php 禁用 eval-CSDN博客 这个方法make报错,懒得费时间处理,直接用第二种 方法二:suhosin禁用 不支持PHP8,官方只支持PHP7以下…

【电源专题】为什么带电量计芯片的电池MOS保护要放在高侧

在实际的电量计电池开发中,发现一个很奇怪的现象。传统电池保护IC往往都是将充电保护和放电保护的两个MOS管放在低侧的。如下所示是文章:【电源专题】读一读单节锂电池保护IC规格书 可以看到M1和M2两个MOS管是放在PB-(也就是电池的负端),我们叫做低端。 而BQ28Z610电…

Python爬虫背后技术详解

在互联网时代,信息量巨大,如何高效地获取和处理这些信息变得尤为重要。Python 爬虫作为一种自动化获取网页信息的技术,已成为许多程序员和数据分析师必备技能之一。本文将深入探讨 Python 爬虫背后的技术原理,并结合实际代码示例来…

股票回购(Stock repurchases)和派发股息(Dividend distributions)有什么相同点和不同点?

中文版 股票回购和派发股息是公司将利润返还给股东的两种主要方式,二者各有优缺点。下面是它们的相同之处和不同之处,并通过具体公司数据进行说明。 相同之处 股东回报:股票回购和派发股息都是公司向股东返还利润的一种方式。股东从中受益…

目标检测常用涨点方法:注意力机制小结(空间注意力、通道注意力、CBAM等)

1.通道注意力 通道注意力(Channel Attention)是在通道维度上对输入数据进行学习,再对不同的通道分配相应的权重表示重要性,从而达到“分配注意力”的效果。SENet(Squeeze and Excitation networks) 是一个典型的使用通…

论基于架构的软件设计方法及应用(ABSD)

论基于架构的软件设计方法及应用(ABSD) 一、引言 随着信息技术的快速发展,软件系统的复杂性和规模性不断增加,传统的软件开发方法已难以满足现代软件项目的需求。基于架构的软件设计方法(Architecture-Based Softwar…

Swift宏的实现

上篇介绍了Swift宏的定义与生声明,本篇主要看看是Swift宏的具体实现。结合Swift中Codable协议,封装一个工具让类或者结构体自动实现Codable协议,并且添加一些协议中没有的功能。 关于Codable协议 Codable很好,但是有一些缺陷&…

编写Linux下共享库SDK

在Linux中,共享库(也称为动态链接库)是一种可以被多个程序共享的可执行代码和数据的集合。在编写共享库的SDK时,我们通常需要提供以下内容: 1. 头文件:包含了共享库提供的函数和数据结构的声明。这些头文件…

1688_item_search_shop接口技术详解

1688_item_search_shop接口技术详解 在B2B电商领域,当商家或消费者需要查找特定店铺的商品时,一个高效的店铺搜索接口显得尤为重要。1688平台作为中国领先的B2B电商平台,提供了item_search_shop接口,使得商家和消费者能够根据店铺…

一个c++的综合实例:log同步写入文件

1. 引言 功能 通过一个API函数把log写入到文件中,分4个log level 目录 ├── log ├── log.cpp ├── log.h ├── main.cpp └── Makefile 2.代码 文件:main.cpp #include "log.h"int main(int argc, char *argv[]) {Log::GetIns…

yaklang window安装 vscode运行得到“hello world”

资源来源:旅程伊始:Yak 语言环境安装与搭建环境 | Yak Program Language 安装yak语言非常简单,管理员权限打开命令行运行以下命令: powershell (new-object System.Net.WebClient).DownloadFile(https://yaklang.oss-cn-beijing…

1085 PAT单位排行(测试点5)

solution 测试点5:总分是在每个学生加权后再取整,所以用来存学生分数的变量要用浮点型学校排序: 若成绩不同,则按成绩降序若成绩相同,人数不同,则按成绩升序若成绩和人数都相同,则按单位名升序…

TS-字面量类型

字面量在代码中表示固定值。在TypeScript中,字面量包括字符串、数值、布尔值、长整型值、对象、数组、函数、正则表达式、null等,例如,以下都是字面量。 99.9 //数值字面量 true //布尔值字面量 "message" //字符…

理解GPT2:无监督学习的多任务语言模型

目录 一、背景与动机 二、卖点与创新 三、几个问题 四、具体是如何做的 1、更多、优质的数据,更大的模型 2、大数据量,大模型使得zero-shot成为可能 3、使用prompt做下游任务 五、一些资料 一、背景与动机 基于 Transformer 解码器的 GPT-1 证明…