Nginx基本数据结构(三)——ngx_chain_t、ngx_buf_t

2023-12-01 04:38

本文主要是介绍Nginx基本数据结构(三)——ngx_chain_t、ngx_buf_t,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • ngx_chain_t
    • 相关操作API
  • ngx_buf_t
    • 相关操作API
  • 参考文献

ngx_chain_t

Nginx的filter模块用来处理从别的filterhandler模块传递过来的数据。这个传递的过程是以一个链表(ngx_chain_t)的形式。而且数据可能会被多次传递。

struct ngx_chain_s
{ngx_buf_t		*buf;ngx_chain_t		*next;
}

相关操作API

ngx_chain_t* ngx_alloc_chain_link(ngx_pool_t* pool);
//创建一个ngx_chain_t对象,并返回指向对象的指针,失败返回null
#define ngx_free_chain(pool, cl)cl->next = pool->chain;pool->chain = cl//该宏释放一个ngx_chain_t对象
//对ngx_chain_t的释放,不是真正的释放内存,而是把这个对象挂在了这个pool对象的一个叫chain字段对应的chain上

ngx_buf_t

这个就是上面ngx_chain_t链表的每个节点的实际数据。

struct ngx_buf_s
{u_char			*pos;			//数据的开始位置u_char			*last;			//数据结束位置off_t			file_pos;		//如果是文件的话,数据开始位置off_t			file_last;		//如果是文件,数据结束位置u_char			*start;			//内存起始位置u_char			*end;			//内存结束位置ngx_buf_tag_t	tag;ngx_file_t		*file;			//对应的文件ngx_buf_t		*shadow;		unsigned		temporary:1;unsigned		memory:1;unsigned		mmap:1;unsigned		recycled:1;unsigned		in_file:1;unsigned		flush:1;unsigned		sync:1;unsigned		last_buf:1;unsigned		last_in_chain:1;unsigned		last_shadow:1;unsigned		temp_file:1;
};

相关操作API

#define ngx_alloc_buf(pool) ngx_palloc(pool, sizeof(ngx_buf_t))
#define ngx_calloc_buf(pool) ngx_pcalloc(pool, ngx_buf_t)ngx_buf_t* ngx_create_temp_buf(ngx_pool_t* pool, size_t size);
/*创建一个ngx_buf_t对象,返回指向这个对象的指针
* pool			分配该buf和buf使用的内存所使用的pool
* size			该buf使用的内存的大小
*/
//以下宏配合bgx_buf_t使用#define ngx_buf_in_memory(b)	(b->temporary || b-<memory ||b->mmap)
//返回buf是否有内容#define ngx_buf_in_memory_only(b)	(ngx_buf_in_memory(b) && !b->infile)
//返回buf内容只在文件而不在文件中#define ngx_buf_special(b)((b->flush || b->last_buf || b->sync)&& !ngx_buf_in_memory(b) && !b->in_file)
//返回这个buf是否是一个特殊的buf#define ngx_buf_synconly(b)(b->sync && !ngx_buf_in_memory(b) && !b->in_file)
//返回该buf是否是一个只包含sync标志而不包含真正数据的特殊buf#define ngx_buf_size(b)(ngx_buf_in_memory(b) ? (off_t)(b->last - b->pos):(b->file_last - b->file_pos))
//返回该buf所含数据的大小,不管数据在哪里

参考文献

[1] Nginx开发从入门到精通

这篇关于Nginx基本数据结构(三)——ngx_chain_t、ngx_buf_t的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/439838

相关文章

Nginx中配置使用非默认80端口进行服务的完整指南

《Nginx中配置使用非默认80端口进行服务的完整指南》在实际生产环境中,我们经常需要将Nginx配置在其他端口上运行,本文将详细介绍如何在Nginx中配置使用非默认端口进行服务,希望对大家有所帮助... 目录一、为什么需要使用非默认端口二、配置Nginx使用非默认端口的基本方法2.1 修改listen指令

Python异步编程之await与asyncio基本用法详解

《Python异步编程之await与asyncio基本用法详解》在Python中,await和asyncio是异步编程的核心工具,用于高效处理I/O密集型任务(如网络请求、文件读写、数据库操作等),接... 目录一、核心概念二、使用场景三、基本用法1. 定义协程2. 运行协程3. 并发执行多个任务四、关键

解决Nginx启动报错Job for nginx.service failed because the control process exited with error code问题

《解决Nginx启动报错Jobfornginx.servicefailedbecausethecontrolprocessexitedwitherrorcode问题》Nginx启... 目录一、报错如下二、解决原因三、解决方式总结一、报错如下Job for nginx.service failed bec

Go语言连接MySQL数据库执行基本的增删改查

《Go语言连接MySQL数据库执行基本的增删改查》在后端开发中,MySQL是最常用的关系型数据库之一,本文主要为大家详细介绍了如何使用Go连接MySQL数据库并执行基本的增删改查吧... 目录Go语言连接mysql数据库准备工作安装 MySQL 驱动代码实现运行结果注意事项Go语言执行基本的增删改查准备工作

redis数据结构之String详解

《redis数据结构之String详解》Redis以String为基础类型,因C字符串效率低、非二进制安全等问题,采用SDS动态字符串实现高效存储,通过RedisObject封装,支持多种编码方式(如... 目录一、为什么Redis选String作为基础类型?二、SDS底层数据结构三、RedisObject

Nginx添加内置模块过程

《Nginx添加内置模块过程》文章指导如何检查并添加Nginx的with-http_gzip_static模块:确认该模块未默认安装后,需下载同版本源码重新编译,备份替换原有二进制文件,最后重启服务验... 目录1、查看Nginx已编辑的模块2、Nginx官网查看内置模块3、停止Nginx服务4、Nginx

通过配置nginx访问服务器静态资源的过程

《通过配置nginx访问服务器静态资源的过程》文章介绍了图片存储路径设置、Nginx服务器配置及通过http://192.168.206.170:8007/a.png访问图片的方法,涵盖图片管理与服务... 目录1.图片存储路径2.nginx配置3.访问图片方式总结1.图片存储路径2.nginx配置

Nginx禁用TLSv1.0 1.1改为TLSv1.2 1.3的操作方法

《Nginx禁用TLSv1.01.1改为TLSv1.21.3的操作方法》使用MozillaSSL配置工具生成配置,修改nginx.conf的ssl_protocols和ssl_ciphers,通... 目录方法一:方法二:使用 MoziChina编程lla 提供的 在线生成SSL配置工具,根据自己的环境填充对应的

nginx配置错误日志的实现步骤

《nginx配置错误日志的实现步骤》配置nginx代理过程中,如果出现错误,需要看日志,可以把nginx日志配置出来,以便快速定位日志问题,下面就来介绍一下nginx配置错误日志的实现步骤,感兴趣的可... 目录前言nginx配置错误日志总结前言在配置nginx代理过程中,如果出现错误,需要看日志,可以把

DNS查询的利器! linux的dig命令基本用法详解

《DNS查询的利器!linux的dig命令基本用法详解》dig命令可以查询各种类型DNS记录信息,下面我们将通过实际示例和dig命令常用参数来详细说明如何使用dig实用程序... dig(Domain Information Groper)是一款功能强大的 linux 命令行实用程序,通过查询名称服务器并输