內核的鏈表實現很靈活,經過在結構體中插入list,便可把結構體串成一個鏈表,而不是建立list,然後將結構體塞入list中。
那麼如何經過遍歷一個結構體list呢。由於實際的list,只是結構體中某個變量的list,須要經過該變量地址,計算得出結構體的地址,這樣遍歷了變量的時候,也就遍歷告終構體。這就是list_for_each_entry所做的。code
循環list對應的entry
#define list_for_each_entry(pos, head, member) \ for (pos = list_entry((head)->next, typeof(*pos), member); \ &pos->member != (head); \ pos = list_entry(pos->member.next, typeof(*pos), member))
該for循環能夠當作三部分for循環
根據list變量地址,獲取entry的地址
#define list_entry(ptr, type, member) \ container_of(ptr, type, member)
ptr: list變量 type:entry對於的結構體類型 member:list在entry的名稱
#define container_of(ptr, type, member) ({ \ typeof( ((type *)0)->member ) *__mptr = (ptr); \ (type *)( (char *)__mptr - offsetof(type,member) );})