thttpd伺服器對於請求處理,請求響應和cgi子程式的執行時間是有限制的,這裡面限制是由timer.c檔案中的函式完成的。計時器的結構為:
typedef struct timerstruct timer;
由此可知此結構為乙個雙向鍊錶結構。
timer_proc為延時處理函式。
client_data為函式的引數。
msecs:為延時處理時間單位為毫秒。
periodic:為計時器重載入表示
time:為此時間處理函式執行的時間。
prev:為此計時器的前向指標。
next:為此計時器的後向指標
hash:為計算的此計時器的hash值。
下面將介紹這個檔案中的函式。
static unsigned int hash( timer* t )
hash函式是根據傳入的timer型資料的秒數和毫秒數的異或計算在去計時器陣列數的餘,得到這個時間再計時器陣列中的位置。
static void l_add( timer* t )
l_add是將建立的計時器處理函式新增在計時器處理鍊錶中,如果計算在hash值的表項的值為空表示此表項為空設定t為此表項的頭結點,對於此表項不為空(hash表存在衝突)根據執行時間的先後順序排序在此表項中的位置。
static void l_remove( timer* t )
l_remove函式為移除此計時器處理函式。
static void l_resort( timer* t )
l_resort函式為重新再新增一次此計時器處理函式
void tmr_init( void )
tmr_init函式初始化計時器物件,設定計時器陣列中的所有元素的值都為0且分配的計時器,活躍狀態的計時器空閒狀態的計時器的值也為0.
timer* tmr_create(
struct timeval* nowp, timerproc* timer_proc, clientdata client_data,
long msecs, int periodic )
tmr_create函式為建立計時器處理函式,nowp為當前的時間,timer_proc為處理函式,client_data為函式的引數,msecs為延遲執行時間,periodic為計時器重載入標誌。tmr_create函式首先將會判斷free_timers(當前可分配的計時器)是否為空為空表示此物件沒有分配空間將會為其分配空間,對於分配空間的設定free_timers(當前可分配的計時器)指向此計時器的乙個計時器單元,設定計時器的處理函式,函式引數和優先順序,根據傳入的時間值設定計時器處理函式的執行時間。並將此計時器處理函式新增至處理鍊錶中,最終返回此計時器物件。
struct timeval* tmr_timeout( struct timeval* nowp )
tmr_timeout函式以timeval物件的返回計時器處理函式的超時時間值。
long tmr_mstimeout( struct timeval* nowp )
tmr_mstimeout函式用於計算計時器hash表中是否有計時器的到了需要執行的時間。返回-1表示hash表為空即沒有計時器處理函式,為0表示所有的計時器未到達計時時間,為正值表示有計時器到達了處理時間即返回的是第乙個到達計時器處理函式處理時間的超時值,單位為毫秒。
void tmr_run( struct timeval* nowp )
void tmr_reset( struct timeval* nowp, timer* t )
tmr_reset函式用於重新設定此計時器處理函式的執行時間,並在計時器處理函式鍊錶中重新新增此計時器。
void tmr_cancel( timer* t )
tmr_cancel函式用於設定此計時器從計時器函式處理鍊錶中刪除此計時器,並釋放此計時器的空間。
void tmr_cleanup( void )
tmr_cleanup清除當前處理的計時器處理函式後面的計時器處理函式的資源
void tmr_term( void )
tmr_term清除所有計時器請求的資源
void tmr_logstats( long secs )
tmr_logstats函式用於列印計時器的狀態資訊,分配的計時器的數量,有多少處於活躍狀態,有多少處於空閒狀態。
Thttpd源程式解析3 Thttpd配置
thttpd在啟動時可以進行配置,可以使用命令的方式也可以使用配置檔案的方式,這裡將對於命令的方式進行配置。下面講解每個命令的意義。1 v 作用 輸出thttpd伺服器的版本資訊,然後退出thttpd程式。注意 當命令引數中有 v引數將會導致程式的退出。2 c 注意 c 後面要直接接檔案的路徑。3 ...
Thttpd源程式解析12 fdwatch c檔案
fdwatch.c檔案的主要作用是管理伺服器的檔案描述符。static int nfiles 最大支援監聽的檔案的數量 static long nwatches 監聽的檔案的數量 static int fd rw 檔案描述符的讀寫狀態陣列 static void fd data 讀寫檔案描述符的資料...
Thttpd源程式解析6 GET和POST的區別
前端面試的時候面試官可能會問你get方法和post的方法的區別,很多書上會說get的請求長度是受限制的,請求在url中等等等下面我們將看thttpd處理get和post方法時怎樣處理。一般的http請求將會分為3各部分以回車換行符間隔 1 起始行 起始行 需要表明請求的方法 請求的檔案的路徑 相對於...