nginx 源码学习笔记(六)——nginx基本数据结构

简单的数据类型

在core/ngx_confing.h中定义了基本的数据类型的映射,大部分都映射到c语言自身的数据类型:

typedef intptr_t ngx_int_t;

typedef uintptr_t ngx_uint_t;

typedef intptr_t ngx_flag_t;

其中ngx_int_t,ngx_flag_t都映射为intptr_t;ngx_uint_t映射为uintptr_t。

这两个类型在/usr/include/stdint.h的定义为:


/* Types for `void *' pointers.  */
#if __WORDSIZE == 64
# ifndef __intptr_t_defined
typedef long int                intptr_t;
#  define __intptr_t_defined
# endif
typedef unsigned long int       uintptr_t;
#else
# ifndef __intptr_t_defined
typedef int                     intptr_t;
#  define __intptr_t_defined
# endif
typedef unsigned int            uintptr_t;
#endif

看到这里大家应该理解,基本操作应该都是一样的。

字符串的数据类型

nginx对c语言字符串类型进行了简单的封装,core/ngx_string.h/c里面包含了这些封装的内容。其中定义了

ngx_str_t,

ngx_keyval_t,

ngx_variable_value_t

这几个基础类型:

typedef struct {
    size_t      len;
    u_char     *data;
} ngx_str_t;


typedef struct {
    ngx_str_t   key;
    ngx_str_t   value;
} ngx_keyval_t;


typedef struct {
    unsigned    len:28;

    unsigned    valid:1;
    unsigned    no_cacheable:1;
    unsigned    not_found:1;
    unsigned    escape:1;

    u_char     *data;
} ngx_variable_value_t;

ngx_str_t 包含两个属性:len即长度, data为数据;初始化使用ngx_string宏进行:

#define ngx_string(str) {sizeof(str) -1,(u_chart*)str }

该模块在ngx_string.h和ngx_string.c中。字符串的操作一般包括:初始化,复制,格式化输出,大小写转换,查找子字符,查找子字符串,字符串转换成数字,字符串编码类型相关函数,字符串比较,trim,split等函数。在这个类中间没有调用其他模块的函数,作为一个http服务器,还需要实现URL转换,简单的html转换等函数。字符串的结构体非常简单实用,是非常值得刚入门的linux开发工程师学习的。

函数 说明
ngx_string 初始化函数
ngx_null_string 初始化空字符串函数
ngx_tolower字符转小写函数
ngx_toupper 字符转大写函数
ngx_strncmp 比较指定长度的字符串是否相同
ngx_strcmp比较字符串是否相同
ngx_strstr 从字符串中找到需要的字符串
ngx_strlen 字符串的长度
ngx_strchr 在字符串中找到匹配的字符,返回 0为匹配
ngx_strlchr 在字符串中找到匹配的字符,返回匹配的指针
ngx_memzero 把一片内存区设置为
0
ngx_memset
把一片内存区设置为指定的数
ngx_memcpy 复制内存,没有返回
ngx_cpymem 复制内存,返回复制完了dst的最后一个字符的下一个字符的指针
ngx_copy
ngx_cpymem
ngx_memcmp
比较内存中的数据是否相同
ngx_strlow 把字符串都转换成小写
ngx_cpystrn 复制字符串,并且返回字符串的最后一个字符的下一个字符的指针
ngx_pstrdup 复制字符串到pool,返回字符串的指针
ngx_sprintf把各种类型的数据格式化输出到buf,最大的长度为
65536
ngx_snprintf
把各种类型的数据格式化输出到指定长度的
buf
ngx_strcasecmp
不分大小写比较两个字符串是否相同
ngx_strncasecmp指定长短不分大小写比较两个字符串是否相同
ngx_strnstr 在指定大小一个字符串中是否有子字符串
ngx_strstrn 在一个字符串中是否有子指定大小的字符串
ngx_strcasestrn 在一个字符串中是否有子指定大小的字符串,不区分大小写
ngx_rstrncmp 从后往前比较两个字符串是否相同,返回相同的位置
ngx_rstrncasecmp 从后往前比较两个字符串是否相同,返回相同的位置,不区分大小写
ngx_memn2cmp比较两个指定长度的内存是否相同,也比较长的内存是否包含短的内存
ngx_atoi 指定长度的字符串转换成数字
ngx_atosz指定长度的字符串转换成ssize_t类型数字
ngx_atoof 指定长度的字符串转换成off_t类型数字
ngx_atotm 指定长度的字符串转换成time_t类型数字

ngx_hextoi指定长度的字符串转换成十六进制数字
ngx_hex_dump把数字转换成16进制的字符串
ngx_encode_base64 base64编码
ngx_decode_base64base64解码
ngx_utf8_decode utf8字符解码成双字节的 unicode或是单字节字符,但是该函数会移动*p的值,

请注意

ngx_utf8_length 得到utf8编码的字符占几个字节
ngx_utf8_cpystrn 赋值utf8字符串,保证完整的复制
ngx_escape_uri uri进行编码
ngx_unescape_uri uri的进行解码
ngx_escape_html html进行编码
ngx_sort 排序,主要是用于数组排序
ngx_qsort 快速排序
ngx_value 把宏数字转换成字符串

为了测试,我们可以用以下两种方式打印出来
1 ngx_str_t str ;
2 printf (
%* s
, str . len , str . data );
3 prinrf (
%V, & str );


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 Windows 下给 nginx 添加 gzip_static_module 模块,需要重新编译 nginx。以下是具体步骤: 1. 安装 Visual Studio 首先需要安装 Microsoft Visual Studio,官网下载地址:https://visualstudio.microsoft.com/zh-hans/downloads/ 2. 下载 nginx 源码nginx 官网下载最新的 nginx 源码:http://nginx.org/en/download.html 3. 解压 nginx 源码 解压下载的 nginx 源码到任意目录,如:C:\nginx-1.20.1 4. 安装 Perl nginx 的编译过程需要用到 Perl,需要安装 Perl。官网下载地址:https://www.perl.org/get.html 5. 安装 PCRE PCRE 是一个支持正则表达式的库,nginx 的编译过程需要用到。可以从这里下载最新的 PCRE:https://ftp.pcre.org/pub/pcre/ 将解压后的文件夹复制到 C 盘根目录,如:C:\pcre-8.44 6. 安装 zlib zlib 是一个压缩库,nginx 的编译过程需要用到。可以从这里下载最新的 zlib:https://zlib.net/ 将解压后的文件夹复制到 C 盘根目录,如:C:\zlib-1.2.11 7. 编辑 nginx 配置文件 在 C:\nginx-1.20.1 目录下找到 conf 目录,编辑 nginx.conf 文件,在 http 模块中添加以下内容: ``` gzip_static on; ``` 8. 编译 nginx 打开 Visual Studio,选择 “文件” -> “打开” -> “项目/解决方案”,找到 C:\nginx-1.20.1 目录下的 nginx.sln 文件,双击打开。 在 Visual Studio 中选择 “生成” -> “生成解决方案”,等待编译完成。 9. 替换旧的 nginx.exe 编译完成后,会在 C:\nginx-1.20.1\objs 目录下生成新的 nginx.exe 文件。将该文件替换旧的 nginx.exe 文件,重启 nginx 服务器即可。 注意:以上步骤仅适用于 Windows 平台下的编译和安装,Linux 平台下的编译和安装方法略有不同。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值