Tinyhttpd 源碼閱讀筆記

Tinyhttpd 源碼閱讀筆記
 php

Tinyhttpd是一個超輕量級的 webserver, 對於瞭解 HTTP 協議, web服務本質有很好的參考價值linux

程序流程
從 main 函數入口開始
1. 分析HTTP信息頭,解釋客戶端傳遞過來的請求方法, URL, 長度等信息
2. 判斷文件是否存在, 不存在則返回 not_found, 存在則判斷是否爲 CGI腳本
3. 假如不是 CGI 腳本,則執行 CAT 函數, 相似linux 的 cat 命令,直接顯示文件文本
4. 假如是 CGI 腳本, 則分下面幾步走git

   A  設置環境變量( 在程序裏面幾乎毫無用處,多是爲了執行 CGI 腳本而準備的)github

   B   定義兩個管道分別是  cgi_input (對應 STDIN ), cgi_output (對應 STDOUT)
  web

   C   fork() 進子進程, 子進程把 STDIN  導向到 cgi_input[0], 把 STDOUT  導向           到 cgi_output[1], execl 執行CGI 腳本,則輸出到  STDOUT, 數據寫入 cgi_output[1], 子進程結束, 進入父進程算法

   D   父進程等待子進程的退出, 而後進入到父進程, 若是是 POST 方法, 把 POST 的數據寫入到  cgi_input[1] 的管道(其實這個處理彷佛沒多大意義,原本  tinyhttpd 對於處理 POST 數據這塊還不成熟, 能夠忽略這個邏輯), 父進程重點邏輯主要是, 讀取 cgi_output[0] 的數據, 也就是在 子進程 那裏執行 CGI 腳本寫入的數據, 而後 把這些數據 發送 給客戶端數組

 

信息流處理過程函數

 

程序算法特色

利用linux管道(pipe)進行 子進程 與  父進程 之間的信息傳遞(也就是一般說的通訊), 管道有兩端, 能夠看做是一個儲存水的「水管」, 當水進來的時候,要先關閉水出去的一端, 當水出去的時候,要先管理水進來的一端, 實際上只是儲存一個「個體完整」信息的一種方式, 一般用一個 整型數組來初始化管道, 例如: int cgi_output[2] , 0 端爲讀, 1 端爲寫學習

有興趣的同窗能夠擴展 tinyhttpd 執行 CGI 那一段邏輯, 好比執行 PHP, 自己 php-cgi 已經作了 HTML 輸出處理的, 其實假如是執行 PHP 文件,能夠直接調用  php-cgi a.php 來輸出HTMLspa

源碼註釋的連接地址爲 https://github.com/halokid/tinyhttpd_note,水平有限,若有錯誤請見諒,留言指正,交流學習,多謝

相關文章
相關標籤/搜索