要使用核心鍊錶,需要包含標頭檔案,鍊錶結構定義如下:
struct list_head ;linux核心中的鍊錶是乙個雙向迴圈鍊錶,結構中只包含兩個指標next和prev,不包含其它任何資料成員,同常見定義鍊錶稍有不同。在linux核心中使用鍊錶,是將鍊錶內嵌在其它結構體中來使用,從這裡也可以看出,linux核心雖然使用c語言這種非物件導向語言,但也體現出了物件導向的思想(繼承)。
例如:
struct todo_struct ;
1. 煉表頭
煉表頭通常需要單獨維護,例如:
struct list_head todo_list;定義了乙個煉表頭todo_list,在使用之前,需要使用巨集init_list_head對鍊表頭做初始化:
init_list_head(&todo_list);
當然,linux核心也提供了乙個巨集用於靜態定義乙個煉表頭並對其做初始化:
list_head(todo_list);實際展開後如下:
struct list_head todo_list = ;所謂初始化就是讓鍊錶中的next、prev指標同時指向自己。
2. list_add和list_add_tail
list_add和list_add_tail函式都是將乙個節點新增到鍊錶上,只是list_add是表頭處,list_add_tail是表尾,函式原型如下:
void list_add(struct list_head *new, struct list_head *head);當然這個頭並不是絕對意義上的煉表頭,也可以是鍊錶中的其它節點,表示在該節點之後或之前插入乙個新節點。void list_add_tail(struct list_head *new, struct list_head *head);
3. list_del
刪除鍊錶中的節點(指刪除entry節點),原型如下:
void list_del(struct list_head *entry);
4. list_empty
判斷鍊錶是否為空,原型如下:
int list_empty(const struct list_head *head);
5. list_splice
通過在head之後插入乙個新煉表來合併兩個鍊錶,原型如下:
void list_splice(const struct list_head *list, struct list_head *head);
6. list_for_each、list_for_each_safe、list_for_each_prev和list_for_each_prev_safe
遍歷鍊錶,list_for_each是從頭開始遍歷,而list_for_each_prev是從尾部開始遍歷,加safe欄位表示如果迴圈中可能會刪除鍊錶中的節點,就應該使用這些函式。
7. list_entry
鍊錶始終是內嵌在其它結構體當中來使用的,但是從前面的api來看,我們最多只能得到鍊錶中的節點,那麼如何得到整個大結構體的指標呢,那就需要使用到這裡的巨集list_entry,例如:
void todo_add_entry(struct todo_struct *new)
} list_add_tail(&new->list, &todo_struct);
}
list_entry定義有三個引數,第乙個引數是struct list_head型別的指標,第二個引數是包含這個struct list_head成員的結構體型別,例如前面的struct todo_struct,第三個引數是結構體中該struct list_head的名字。
8. list_for_each_entry、list_for_each_entry_safe
使用這兩個巨集的話,就不用在list_for_each中呼叫list_entry巨集。
Linux核心 10 核心中的鍊錶
使用鍊錶的目的很明確,因為有很多事情要做,於是就把它放進煉表裡,一件事一件事的處理。比如在usb子系統裡,u盤不停的提交urb請求,usb鍵盤也提交,usb滑鼠也提交,那usb主機控制器咋應付得過來呢?很簡單,建乙個鍊錶,然後你每次提交就是往裡邊插入,然後usb主機控制器再統一去排程,乙個乙個來執行...
Linux核心中煉表處理
最基本的定義 struct list head define container of ptr,type,member 通過指標ptr,獲取對應的結構體指標。其中member是typeof中的指標。ptr就是指向member。define list for each entry pos,head,m...
Linux核心裝置驅動之核心中煉表的使用筆記整理
核心中煉表的應用 1 介紹 在linux核心中使用了大量的鍊錶結構來組織資料,包括裝置列表以及各種功能模組中的資料組織。這些鍊錶大多採用在include linux list.h實現的乙個相當精彩的鍊錶資料結構。鍊錶資料結構的定義很簡單 struct list head list head結構包含兩...