【nginx】基本數據結構

首先,是整數類型:
src/core/ngx_config.h

typedef intptr_t        ngx_int_t;
typedef uintptr_t       ngx_uint_t;
typedef intptr_t        ngx_flag_t;

即整數、無符號整數和bool。intptr_t 等三種類型定義如下:
/usr/local/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

即:64系統則使用長整形(8字節),否則使用整形(4字節)。

然後是字符串型:
/src/core/ngx_string.h

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

接着,定義了一堆字符串相關的函數,類似於對應於ngx_str_t的成員函數吧。

函數 描述
ngx_string(str) 構造函數,str指向\0結尾的字符串
ngx_null_string 空構造函數
ngx_str_set(str, text) text指向\0結尾的字符串,將它set給ngx_str_t對象str
ngx_strncmp 封裝strncmp
ngx_strcmp 封裝strcmp

此外,順便定義了其他幾個類型:

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;
typedef struct {
    ngx_rbtree_node_t         node;
    ngx_str_t                 str;
} ngx_str_node_t;

定義了自己的錯誤類型:(原因是系統的strerror和strerror_r函數不是信號安全的,因此作者將錯誤碼對應的錯誤msg拷貝了一遍,自己維護,自己的函數寫的很簡單,是信號安全的)
src/os/unix/ngx_errno.h

typedef int               ngx_err_t;
// 根據錯誤號err,將對應的描述信息拷貝到errstr,最多拷貝size字節
u_char *ngx_strerror(ngx_err_t err, u_char *errstr, size_t size); 
ngx_int_t ngx_strerror_init(void);

系統的errno.h中定義了錯誤號,多層include後最終錯誤號定義於/usr/include/asm-generic/errno.h中。
而strerror和strerror_r函數聲明於string.h

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章