lighttpd 之五 資料結構
1.1 bitset資料結構
bitset資料結構提供對bit位操作的封裝。提供對bit的置位操作,清位操作,測試位操作等常用位操作。
相關部分原始碼:
bitset.h
bitset.c
在高版本的lighttpd原始碼中已經刪除。
1.2 buffer資料結構
buffer結構體以及其相關實現函式替lighttpd管理者字串的記憶體使用與操作。在Web伺服器中,很多的處理
都是針對字串進行的,比如客戶端請求的URI地址,傳送的query引數、post提交的資料、伺服器的響應內容等
都是一些字串的集合。因此提供對字串的靈活操作以及封裝對字串的高效處理,不管是對前期的lighttpd功能
開發還是對後期lighttpd實際執行的效率都有著至關重要的作用。
相關部分原始碼:
buffer.h
buffer.c
1.3 data_xxxxx資料結構
1.3.1 結構說明
data_xxxxx資料結構體表示的是一類資料結構體,總覽lighttpd-1.4.20的137個原始檔,不難發現有幾個檔案命名
很一致的原始檔,它們是data_array.c,data_config.c,data_count.c、data_fastcgi.c、data_integer.c、data_string.c.,這
些檔案實現的是lighttpd中非常重要的基礎資料結構部分、本節就來分析它們是怎麼組織的,它們之間到底是什麼關係。
本節相關部分原始碼:
buffer.h
buffer.c
1.3.2 結構定義
data_xxxxx資料結構全部都定義在array.h標頭檔案內、包括有data_unset、data_array、data_config、data_count、
data_fastcgi、data_integer、data_string。data_unset是基礎,首先檢視data_unset結構體,很簡單,裡面就一個
DATA_UNSET巨集,將其展開後就是其結構體元素。另外的幾個結構體,也都是第一個元素為DATA_UNSET巨集,另外各個
結構體再包含有自己特有的一些屬性元素。在結構體的初始化函式data_xxxxx_ini()內,各自結構體實現原始檔內提供的
介面函式都將賦值給對應的結構體函式指標欄位,這樣在對data_unset操作時會根據其實際型別而呼叫不同的函式,如果
利用面向物件的思想來看待這些結構體,很容易想到把data_unset看做基類,而其他data_array等看作子類,這實現的
就是所謂的繼承和多型效果,這樣一來我們可以畫出他們之間的UML圖,如下所示。lighttpd開發者利用C語言來模擬面
向物件的實現,一方面使得程式資料結構擴充套件靈活,具有面向物件技術的優勢,另一方面又擁有C語言本身操作資料的
便利。在lighttpd原始碼的其它地方,還可以看到作者的這種靈活設計。