#define offsetof(type, member) ((size_t) &((type*)0 -> member)) //member的offset
#define container_of (ptr ,type ,member) ({
const typeof(((type*)0)->member)* __mtpr = (ptr) ; //ptr链表节点指针
(type*) ((char*)__mptr - offsetof(type , member)) ; //member节点在type中的名字
}) //由member与ptr取得type定义变量的地址
#define list_entry(ptr, member , type) container_of(ptr , member , type)
struct list_head {
list_head *next;
list_head *prev;
}
ptr是指结构向list_head的数据结构的指针,type是容器数据的类型,member是list_head在type中的名字。
eg:
struct data{
data_type XXX;
list_head str1;
list_head str2;
data_type XXX;
}
struct data name;
head_list *p = &name.str1;
head_list *q = &name.str2;
list_entry( p ,struct name ,str1) == &name;
list_entry( q ,struct name ,str2) == &name;
由此可实现在内核中一个进程块挂到不同的链表上,如任务链表和优先级链表。