最基本的定義:
struct list_head
;#define container_of(ptr, type, member) ()
通過指標ptr, 獲取對應的結構體指標。其中member是typeof中的指標。ptr就是指向member。
#define list_for_each_entry(pos, head, member) list_for_each_entry_safe(pos, pos, head, member)
#define list_for_each(pos, head) for (pos = (head)->next; prefetch(pos->next), pos != (head); pos = pos->next)
上面的不但獲取到寫乙個list_head,並且通過list_entry獲取到list對應的結構體。
下面的pos則直接是head->next的型別,在linux核心中一般是list_head型別。
#define list_for_each_safe(pos, n, head) for (pos = (head)->next, n = pos->next; pos != (head); pos = n, n = pos->next)
#define list_for_each_entry_safe(pos, n, head, member)\
for (pos = list_entry((head)->next, typeof(*pos), member),\
n = list_entry(pos->member.next, typeof(*pos), member); &pos->member != (head); pos = n, n = list_entry(n->member.next, typeof(*n), member))
該巨集則通過n儲存了pos對應的下乙個物件,當在有刪除操作時刪除了當前節點還可以通過next繼續遍歷下去。其實在只要找到乙個節點的時候完全沒有必要這個n節點。
Linux核心中的鍊錶
要使用核心鍊錶,需要包含標頭檔案,鍊錶結構定義如下 struct list head linux核心中的鍊錶是乙個雙向迴圈鍊錶,結構中只包含兩個指標next和prev,不包含其它任何資料成員,同常見定義鍊錶稍有不同。在linux核心中使用鍊錶,是將鍊錶內嵌在其它結構體中來使用,從這裡也可以看出,li...
Linux核心 10 核心中的鍊錶
使用鍊錶的目的很明確,因為有很多事情要做,於是就把它放進煉表裡,一件事一件事的處理。比如在usb子系統裡,u盤不停的提交urb請求,usb鍵盤也提交,usb滑鼠也提交,那usb主機控制器咋應付得過來呢?很簡單,建乙個鍊錶,然後你每次提交就是往裡邊插入,然後usb主機控制器再統一去排程,乙個乙個來執行...
Linux核心裝置驅動之核心中煉表的使用筆記整理
核心中煉表的應用 1 介紹 在linux核心中使用了大量的鍊錶結構來組織資料,包括裝置列表以及各種功能模組中的資料組織。這些鍊錶大多採用在include linux list.h實現的乙個相當精彩的鍊錶資料結構。鍊錶資料結構的定義很簡單 struct list head list head結構包含兩...