nginx使用ngx_int_t封裝有符號整型,使用ngx_uint_t封裝無符號整型
ngx_int_t、ngx_uint_t的定義如下:
typedef intptr_t ngx_int_t;
typedef uintptr_t ngx_uint_t;
ngx_str_t結構就是字串。ngx_str_t的定義如下:
typedef struct
ngx_str_t;
ngx_str_t只有兩個成員,其中data指標指向字串起始位址,len表示字串的有效長度。
ngx_str_t的data成員指向的並不是普通的字串,因為這段字串未必會以'\0'作為結尾,所以使用時必須根據長度len來使用data成員
例如定義乙個ngx_test_str,判斷字串是否是「hello」時,需要執行如下:
ngx_str_t ngx_test_str;
if (0 == ngx_strncmp( ngx_test_str.data, "hello", r->method_name.len) )
任何試圖將ngx_str_t的data成員當做字串來使用的情況,都可能導致記憶體越界!
ngx_list_t是nginx封裝的鍊錶容器,它在nginx中使用得很頻繁,例如http的頭部就是用ngx_list_t來儲存的。
定義:
typedef struct ngx_list_part_s ngx_list_part_t;
struct ngx_list_part_s
; typedef struct
ngx_list_t;
ngx_list_t描述整個鍊錶,而ngx_list_part_t只描述鍊錶的乙個元素。
每個鍊錶元素ngx_list_part_t又是乙個陣列,擁有連續的記憶體,它既依賴於ngx_list_t裡的size和nalloc來表示陣列的容量,同時又依靠每個ngx_list_part_t成員中的nelts來表示陣列當前已使用了多少容量。因此,ngx_list_t是乙個鍊錶容器,而鍊錶中的元素又是乙個陣列。ngx_list_part_t陣列中的元素才是使用者想要儲存的東西
每個成員的意義:
(1)ngx_list_t
·part:鍊錶的首個陣列元素。
·last:指向鍊錶的最後乙個陣列元素。
·size:通過size限制每乙個陣列元素的占用的空間大小,也就是使用者要儲存的乙個資料所占用的位元組數必須小於或等於size。
·nalloc:nalloc表示每個ngx_list_part_t陣列的容量,即最多可儲存多少個資料。
·pool:鍊錶中管理記憶體分配的記憶體池物件。ngx_list_t中的所有資料都是由ngx_pool_t型別的pool記憶體池分配的,它們通常都是連續的記憶體。
(2)ngx_list_part_t
·nelts:表示陣列中已經使用了多少個元素。nelts必須小於ngx_list_t結構體中的nalloc。
圖中是由3個ngx_list_part_t陣列元素組成的ngx_list_t鍊錶的一種記憶體分布結構,pool記憶體池為其分配了連續的記憶體,最前端記憶體儲存的是ngx_list_t結構中的成員,緊接著是第乙個ngx_list_part_t結構占用的記憶體,然後是ngx_list_part_t結構指向的陣列,它們一共占用size*nalloc位元組,表示陣列中擁有nalloc個大小為size的元素。其後面是第2個ngx_list_part_t結構以及它所指向的陣列,依此類推。
ngx_table_elt_t資料結構如下所示:
typedef struct
ngx_table_elt_t;
ngx_table_elt_t就是乙個key/value對,ngx_str_t型別的key、value成員分別儲存的是名字、值字串。
hash用於快速檢索頭部。lowcase_key指向的是全小寫的key字串。
ngx_table_elt_t是為http頭部「量身訂製」的,其中key儲存頭部名稱(如content-length),value儲存對應的值(如「1024」)。
struct ngx_buf_s ;
ngx_chain_t是與ngx_buf_t配合使用的鍊錶資料結構:
typedef struct ngx_chain_s ngx_chain_t;
struct ngx_chain_s
;
buf指向當前的ngx_buf_t緩衝區,next則用來指向下乙個ngx_chain_t。如果這是最後乙個ngx_chain_t,則需要把next置為null。
在向使用者傳送http包體時,就要傳入ngx_chain_t鍊錶物件,如果是最後乙個ngx_chain_t,那麼必須將next置為null,否則永遠不會傳送成功!而且這個請求將一直不會結束(nginx框架的要求)。
參考: 《深入理解nginx》 陶輝 機械工業出版社
nginx中ngx list的資料結構
今天沒事了,在檢視nginx源 中看到ngx list的結構,發現設計為鍊錶陣列的形式,不知道為什麼這樣設計 struct ngx list part s typedef struct ngx list t 只實現三個方法 ngx list t ngx list create ngx pool t ...
資料結構基礎 週末舞會 詳細題解
題目描述 假設在週末舞會上,男士們和女士們進入舞廳時,各自排成一隊。跳舞開始時,依次從男隊和女隊的隊頭上各出一人配成舞伴。規定每個舞曲能有一對跳舞者。若兩隊初始人數不相同,則較長的那一隊中未配對者等待下一輪舞曲。現要求寫乙個程式,模擬上述舞伴配對問題。輸入 第一行兩個正整數,表示男士人數m和女士人數...
資料結構基礎45 牛的旅行 詳細題解
題目描述 農民john的農場裡有很多牧區。有的路徑連線一些特定的牧區。一片所有連通的牧區稱為乙個牧場。但是就目前而言,你能看到至少有兩個牧區不連通。現在,john想在農場裡新增一條路徑 注意,恰好一條 對這條路徑有這樣的限制 乙個牧場的直徑就是牧場中最遠的兩個牧區的距離 本題中所提到的所有距離指的都...