contributed by < grb72t3yde
>
sysprog2020
queue.[ch]
和連帶的檔案,測試後用 Git 管理各項修改,記得也該實作 q_sort
函式。
queue_t
中加入下列屬性, 其用以實現具有O(1)時間複雜度的q_size()
和q_insert_tail()
函式queue_t *q_new()
malloc()
的回傳值確認是否成功, 否則回傳 NULLvoid q_free(queue_t *q)
bool q_insert_head(queue_t *q, char *s)
bool q_insert_tail(queue_t *q, char *s)
bool q_remove_head(queue_t *q, char *sp, size_t bufsize)
int q_size(queue_t q)
void q_reverse(queue_t *q)
void q_sort(queue_t *q)
Using Local References method
參考 你所不知道的 C 語言:函式呼叫篇, 將所有用以操作 free()
且不再使用的指標在呼叫 free()
後指向 NULL
qtest
實作 coroutine,嘗試整合 tiny web server 進 qtestopen_listenfd
,包含 server 端創建 socket descripter,bind,listen 等呼叫。bind 請求 kernel 將 listenfd 和 serveraddr 連結; listen 則將 listenfd 從 active socket 轉換成 listen socket ,一個可從 client 接收請求狀態。process
等待一個並隨後拆解 request 的檔案名稱並使用 rio_readlineb
讀取檔案。如下圖輸出結果,目前的程式碼預設會建立四個子程序,加上原本的程序(2450689)共有五個程序可同時服務 clients,若有後續連線請求將暫時得不到回應。
文字導向的訊息不要用圖片顯示,否則不利於日後資料檢索,更對視覺障礙者不友善。
:notes: jserv
已修正
FORK_COUNT
改成 0
,以 coroutine.h 實作 coroutine。FORK_CPUNT
改為 0
,則目前只能同時服務一個 client。acceptor
負責接收來自 client 的連線領求,以及一個 scheduler 負責建立 coroutines 來處理已經建立連線的 socket 資料讀取。首先我將先前創建的 listenfd 改為 non-blocking,則程序在 accept 時並不會 block。
acceptor
的程式碼如下 :
其會在 accept 到連線的時候將 client 加進 client pool (關於 client pool 的實作請參考 CS:APP 第十二章節),其餘時候,會 yield 出執行權。
select
等 event-driven 的設計)。scheduler 為每個已經連線的 client 建立一個 coroutine,以協調處理不同 client 之間的 socketfd 讀寫操作。coroutine 的特性為每次重新進入時可以從上次的返回點之下一行繼續執行。