主講人: jserv / 課程討論區: 2019 年系統軟體課程
返回「Linux 核心設計」課程進度表
CMU Introduction to Computer Systems (ICS) 準備了 C Programming Lab 作為檢閱學生 C 語言程式設計的認知:
實驗目標為實作 queue
make
後,Git pre-commit hook 將自動安裝到現行的工作區 (workspace),之後每次執行 git commit
時,Git hook 會檢查 C/C++ 原始程式碼的風格是否一致:
qtest
執行檔內有包裝許多測試這次作業可用的工具,執行 qtest
後可打 help
即有各指令解說
qtest 使用範例:
如果什麼都沒做,當然是零分,參考輸出:
取得程式碼: (一旦你 fork 後,可將 sysprog21
換為你的 GitHub 帳號)
編譯:
預期會看到以下輸出:
事先編輯檔案 queue.h
後,執行 git commit
會發現:
原來要指定變更的檔案,用命令 git add
:
git commit
前,應詳閱 如何寫好 Git Commit Message重新 git commit
,這時可發現安裝的 Git hooks 發揮作用了:
Git hook 提示我們:
e
,可編輯 git commit
的訊息y
,因為 y 不是有效選項, 所以出現 helpe
, 再次編輯訊息,因訊息有限制標題開頭要大寫commit 前再調整訊息,注意,請避免用 git commit -m
,而是透過編輯器調整 git commit message。
接著將本地端的修改同步 GitHub 上,執行 git push
: (下方的 butastur-rtos
是示範帳號,請換為你自己的 GitHub 帳號名稱)
牛刀小試,嘗試實作函式 q_size
。
int q_size(queue_t *q)
由於要在 的常數時間內執行完成, 所以也不可能每次都走訪整個 list 來取得 queue 的大小,
queue.h
的註解提到:
You will need to add more fields to this structure to efficiently implement q_size and q_insert_tail
因此,我們增加 int size 到 struct queue_t
:
接著修改 q_size
的傳回值, 改成傳回 q->size
, 一切就緒後,提交修改:
發現格式不對,所以 Git commit hook 擋住了,所以我們用 clang-format -i
去調整格式,才能繼續。
用 valgrind
來檢查一下 qtest
的執行結果是否存在 memory leak
對 valgrind
多一些嘗試, 試一下 valgrind --leak-check=full
queue.[ch]
和連帶的檔案,測試後用 Git 管理各項修改。
qtest
的行為和裡頭的技巧