1. 程式人生 > >lighttpd 之五 資料結構

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原始碼的其它地方,還可以看到作者的這種靈活設計。

                

1.4 chunk資料結構

       1.4.1 結構說明