contributed by < rebvivi
>
linux2019
qtest
得以支援list.h
還定義一系列操作,為什麼呢?這些有什麼益處?LIST_POISONING
這樣的設計有何意義?list_for_each_safe
和 list_for_each
的差異在哪?“safe” 在執行時期的影響為何?@
符號,這有何意義?你能否應用在後續的程式開發呢?
tests/
目錄底下的 unit test 的作用為何?就軟體工程來說的精神為何?tests/
目錄的 unit test 可如何持續精進和改善呢#define
這個語法,描述一段算式或變數
,在 compile 之前, preprocessor 就會將所有算式或變數
用 macro_name
做代換,執行時不需要 function call 一樣有 stack 的 push 或是 pop,讓執行的速度變快list_head
的 doubly linked list
,包含 next 和 prev 兩個 pointer ,分別指向下一個跟前一個 node一開始都會把 next 和 prev 指向自己做 initialization
之後就可以藉此判斷 list 是否是空的
參考資料:Linked Lists - Linux Device Drivers, Second Edition
typeof 是 C 語言的 extension,用於傳回物件的 type
typeof 的參數可以有兩種:
假設 x 是一個 array of pointers to functions ,我們可以得到這個 function 回傳值的 type
我們得到的 type 是 pointers to int
在 macro 的時候,可能無法判斷 a 和 b 的 type,所以如果使用 typeof 的話可以讓 macro 動態的接受不同的 type ,除了避免 type 轉換中產生錯誤,也可以讓程式更有彈性
(type *) 0)->member
:
0 轉型為 pointer to type 並將它指向 member
__typeof__(((type *) 0)->member)
:
取得 "member 的 type"
__typeof__(((type *) 0)->member) *__pmember
:
將 __pmember 宣告為 pointer to "member 的 type"
__typeof__(((type *) 0)->member) *__pmember = (ptr)
:
將 ptr 的位址 assign 給 __pmember
The macro offsetof() returns the offset of the field member from the start of the structure type.
offsetof(type, member)
:
member 在 type 這個 structure 的 offset
(char *) __pmember - offsetof(type, member)
:
__pmember 是指向 “member 的 type” 的,如果再減去 “member 的 type” 在 type 這個 structure 的 offset,可以得到 type 這個 structure 的起始位置
(type *) ((char *) __pmember - offsetof(type, member))
:
將 type 這個 structure 的起始位置轉型為 type
__extension__
:
避免 gcc 提出警告
list.h
還定義一系列操作,為什麼呢?這些有什麼益處?linkes list
這個 structure 而受到限制參考資料:Linux source code: include/linux/list.h
LIST_POISONING
這樣的設計有何意義如果我們將一個
doubly linked list
中的 node 刪除
在刪除 node 之後, node 變成一個 uninitialized node,當我們去 access 這個 node 會變得不安全,所以我們會將 node 的 next 和 prev 指向不合法的記憶體位址,之後如果我們試圖去 access 這個被刪除的 node,就會直接產生 page fault,確保我們 access 資料時的安全性
如果 linked list 採用環狀的結構,就沒有一般 linked list 那些 head 和 tail 的問題,對每個 node 來說並沒有操作上的不同,而且能夠任意一個 node 去 traverse 整個 linked list ,並不一定限制要從 head 開始
當我們在搜尋網頁的時候,網頁往往會有 page rank ,用來分析網頁的相關性和重要性,而 page rank 會隨著網頁的點擊率而上升或下降,所以我們就要使用 sorting 來幫我們依照 page rank 的大小做排序
list_for_each_safe
和 list_for_each
的差異在哪?“safe” 在執行時期的影響為何?我們並不能更改任何一個 node ,假如我們 delete 掉一個 node ,我們會因此找不到原本 node 的下一個 element,因此失去 node 的後面那些資料
list_for_each_safe
相對list_for_each
多了一個 safe 的暫存空間,而 safe 指向 node 的下一個 element ,避免我們將 node 給 delete 掉之後,會找不到原本 node 的下一個 element
for_each 不像一般我們在 C 語言使用的 for 需要有一個 counter , for_each 會將所有的 element 都跑過一遍
輸出結果
for_each 對我們人來說,使用起來更為精簡方便,可讀性也更高
@
符號,這有何意義?你能否應用在後續的程式開發呢?(提示: 對照看 Doxygen)我們在註解的前方加入一些 Doxygen 支援的指令,比如說@
這個符號,可以告訴 Doxygen 這是特殊的指令,例如:
以下用於說明一個 function , parameter 是參數的名稱,而後方往往會連接對這個 parameter 的說明
以下是
list_head
上方的註解,也是@
這個符號的實際應用
在註解前方加入@
等等的指令之後,能夠讓 Doxygen 更容易辨識一些關鍵字,更容易產生說明程式的文件
tests/
目錄底下的 unit test 的作用為何?就軟體工程來說的精神為何?tests/
目錄的 unit test 可如何持續精進和改善呢?可以根據一些極端值或邊界值做測試,看看程式會不會因此產生錯誤,讓程式能夠因應各式各樣的 input