- 1、本文档共25页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Nginx 基本数据结构.pdf
Nginx 基本数据结构
基本数据结构
Nginx 的作者为追求极致的⾼效,⾃⼰实现了很多颇具特⾊的 Nginx 风格的数据结构
以及公 函数。⽐如,Nginx 提供了带长度的字符串,根据编译器选项优化过的字符
串拷贝函数 ngx_copy 等。所以,在我们写 Nginx 模块时,应该尽量调⽤ Nginx 提供
的 api ,尽管有些 api 只是对 glibc 的宏定义。本节,我们介绍 string、list 、buffer 、
chain 等⼀系列最基本的数据结构及相关api的使⽤技巧以及注意事项。
ngx_str_t
在 Nginx 源码⽬录的 src/core 下⾯的 ngx_string.h|c ⾥⾯,包含了字符串的封装
以及字符串相关操作的 api 。Nginx 提供了⼀个带长度的字符串结构 ngx_str_t ,它的原
型如下:
typedef struct {
size_t len;
u_char *data;
} ngx_str_t;
在结构体当中,data 指向字符串数据的第⼀个字符,字符串的结束⽤长度来表⽰,⽽
不是由\\0来表⽰结束。所以,在写 Nginx 代码时,处理字符串的⽅法跟我们平时
使⽤有很⼤的不⼀样,但要时刻记住,字符串不以\\0结束,尽量使⽤ Nginx 提供
的字符串操作的 api 来操作字符串。
那么,Nginx 这样做有什么好处呢?⾸先,通过长度来表⽰字符串长度,减少计算字
符串长度的次数。其次,Nginx 可以重复引⽤⼀段字符串内存,data 可以指向任意内
存,长度表⽰结束,⽽不⽤去 copy ⼀份⾃⼰的字符串( 因为如果要以\\0结束,⽽
不能更改原字符串,所以势必要 copy ⼀段字符串) 。我们在 ngx_http_request_t 结构体
的成员中,可以找到很多字符串引⽤⼀段内存的例⼦,⽐如 request_line 、uri、args 等
等,这些字符串的 data 部分,都是指向在接收数据时创建 buffer 所指向的内存中,
uri ,args 就没有必要 copy ⼀份出来。这样的话,减少了很多不必要的内存分配与拷
贝。
正是基于此特性,在 Nginx 中,必须谨慎的去修改⼀个字符串。在修改字符串时需要
认真的去考虑:是否可以修改该字符串;字符串修改后,是否会对其它的引⽤造成影
响。在后⾯介绍 ngx_unescape_uri 函数的时候,就会看到这⼀点。但是,使⽤ Nginx
的字符串会产⽣⼀些问题,glibc 提供的很多系统 api 函数⼤多是通过\\0来表⽰字
符串的结束,所以我们在调⽤系统 api 时,就不能直接传⼊ str-data 了。此时,通常
的做法是创建⼀段 str-len + 1 ⼤⼩的内存,然后 copy 字符串,最后⼀个字节置
为\\0。⽐较 hack 的做法是,将字符串最后⼀个字符的后⼀个字符 backup ⼀个,
然后设置为\\0,在做完调⽤后,再由 backup 改回来,但前提条件是,你得确定
这个字符是可以修改的,⽽且是有内存分配,不会越界,但⼀般不建议这么做。接下
来,看看 Nginx 提供的操作字符串相关的 api 。
#define ngx_string(str { sizeof(str - 1, (u_char * str
ngx_string(str) 是⼀个宏,它通过⼀个以\\0结尾的普通字符串 str 构造⼀个 Nginx
的字符串,鉴于其中采⽤ si eof 操作符计算字符串长度,因此参数必须是⼀个常量字
符串。
#define ngx_null_string { 0, NULL }
定义变量时,使⽤ ngx_null_string 初始化字符串为空字符串,符串的长度为 0 ,data
为 NULL 。
#define ngx_str_set(str, text
(str -len = sizeof(text - 1; (str -data = (u_char * t
ngx_str_set ⽤于设置字符串 str 为 text ,由于使⽤ si eof 计算长度,故 text 必须为常量
字符串。
#define ngx_str_null(str (str -len = 0; (str -data = NUL
n
您可能关注的文档
- FUTURE-CMS内容管理平台产品技术白皮书.pdf
- GMP、KMP安装操作维护手册.pdf
- HK 6x6带支架侧按 05-000规格书.pdf
- HP CP1215151515181312硒鼓加粉图解.doc
- html5培训视频教程百度云.pdf
- intouch2014授权安装教程.doc
- IOI视频监控方案.doc
- linux系统rm-rf执行以后处理.pdf
- Linux编程linux视频教程(完整版).docx
- mac手把手教你汉化.pdf
- 2025年8月 在全市防汛工作视频会议上的讲话.docx
- 在2025年市委常委班子集中整治问题整改工作专题会议上的讲话+党课:以过硬作风护航高质量发展以实干担当书写新时代“赶考”答卷.pdf
- 国有企业2025年在“贯彻党中央决策部署和国企改革要求方面、全面从严治党责任落实方面、基层党组织建设方面、巡察整改长效机制建设四个方面”巡察整改专题民主生活会存在的原因分析.docx
- 2篇 2025年在四届区委第十三轮巡察动员部署会议上的讲话.pdf
- 在理论学习中心组巡视整改专题学习研讨会议上的讲话+在省委巡视反馈问题整改部署会上的讲话+工作领导小组会议上的讲话.pdf
- 2篇 2025年在四届区委第十三轮巡察动员部署会议上的讲话.docx
- 2025年国企理论学习中心组巡视巡察专题民主生活会会前学习研讨+(2025年四个方面)巡察整改专题民主生活会个人发言提纲.docx
- 局党组、宣传部、纪委监委关于2025年上半年意识形态工作总结及2025年下半年工作打算.pdf
- 4篇 2025年在学习贯彻《中华人民共和国监察法实施条例》研讨交流会上的发言.pdf
- 在市委理论学习中心组中央城市工作会议精神专题学习研讨会上的发言.+关于传达中央城市工作会议精神的讲话提纲.docx
文档评论(0)