nginx原始碼學習 資料結構 ngx str

2022-03-13 17:01:23 字數 2687 閱讀 5097

nginx中關於字串的資料結構位於src/core/ngx_string.c和src/core/ngx_string.h中

先來看一下資料結構:

1 typedef struct

ngx_str_t;

data指標指向字串起始位址,len表示字串的有效長度。這裡面的data並不保證以'\0'結尾,所以必須配合len去使用,否則極其容易造成緩衝區溢位。另外,不保證以'\0'也就說明它是二進位制安全的。

下面看一下比較簡單的一些函式,都是用巨集對c語言中字串的庫函式做了一層封裝而已。

nginx 字串的初始化使用 ngx_string 或 ngx_null_string ,這兩個巨集定義如下:

1

#define ngx_string(str)

2#define ngx_null_string

若已經定義了 nginx 字串變數之後再賦值,則必須使用 ngx_str_set, ngx_str_null 巨集定義:

1

#define ngx_str_set(str, text)

2 (str)->len = sizeof(text)-1; (str)->data = (u_char *)text34

#define ngx_str_null(str) (str)->len = 0; (str)->data = null

以下是例子:

1

/*例如:*/2

/*正確寫法

*/3 ngx_str_t str1 = ngx_string("

hello nginx");

4 ngx_str_t str2 =ngx_null_string;56

/*錯誤寫法*/7

ngx_str_t str1, str2;

8 str1 = ngx_string("

hello nginx

"); /*

編譯出錯

*/9 str2 = ngx_null_string; /*

編譯出錯

*/10

11/*

正確寫法

*/12

ngx_str_t str1, str2;

13 ngx_str_set(&str1, "

hello nginx");

14 ngx_str_null(&str2);

15/*

注意:ngx_string 和 ngx_str_set 字串引數必須是常量字串,不能是變數字串

*/

1 #define ngx_strncmp(s1, s2, n)  strncmp((const char *) s1, (const char *) s2, n)

1

#define ngx_strcmp(s1, s2) strcmp((const char *) s1, (const char *) s2)

1

#define ngx_strstr(s1, s2) strstr((const char *) s1, (const char *) s2)

1

#define ngx_strlen(s) strlen((const char *) s)

1

#define ngx_strchr(s1, c) strchr((const char *) s1, (int) c)

1

#define ngx_memzero(buf, n) (void) memset(buf, 0, n)

2#define ngx_memset(buf, c, n) (void) memset(buf, c, n)

1

#define ngx_memcpy(dst, src, n) (void) memcpy(dst, src, n)

2#define ngx_cpymem(dst, src, n) (((u_char *) memcpy(dst, src, n)) + (n))

1

#define ngx_memmove(dst, src, n) (void) memmove(dst, src, n)

2#define ngx_movemem(dst, src, n) (((u_char *) memmove(dst, src, n)) + (n))

1

#define ngx_memcmp(s1, s2, n) memcmp((const char *) s1, (const char *) s2, n)

這些函式都沒有什麼好解釋的。

轉換大小寫的函式:

1

#define ngx_tolower(c) (u_char) ((c >= 'a' && c <= 'z') ? (c | 0x20) : c)

2#define ngx_toupper(c) (u_char) ((c >= 'a' && c <= 'z') ? (c & ~0x20) : c)

這裡非常巧妙,就是對第6位進行處理,大小寫字母的差是32,而0x20對應32。

還有一些需要再補充……

nginx原始碼學習 資料結構 ngx int

nginx中關於整型的資料結構位於src core ngx config.h中 結構比較簡單,就是乙個typedef的操作,具體如下 1 typedef intptr t ngx int t 2typedef uintptr t ngx uint t 3 typedef intptr t ngx f...

Nginx原始碼結構

上一章對nginx的架構有了乙個初步的了解。這章,為了對原始碼仔細的剖析,先要對nginx的原始碼結構有乙個了解。從巨集觀上把握原始碼模組的結構。一.nginx原始碼的3個目錄結構 在安裝的nginx的目錄下,有乙個目錄src,這裡邊存放了nginx的所有源 包括 core,event,http,m...

資料結構原始碼 迷宮

include include include include include define stack init size 1000 define stack more 10 define overflow 2 define ok 1 define error 0 define true 1 de...