在Linux中,container_of
是一个宏函数,用于计算给定成员变量的指针所在的结构体的指针。它的定义如下:
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
container_of
宏函数接受三个参数:
ptr
:指向成员变量的指针。type
:结构体类型。member
:成员变量的名称。它的作用是返回给定成员变量的指针所在的结构体的指针。
举个例子,假设我们有以下的结构体定义:
struct person {
char name[20];
int age;
struct list_head list;
};
其中list
是一个链表节点,类型为struct list_head
。如果我们有一个指向list
的指针变量ptr
,我们可以使用container_of
来获取ptr
所在的person
结构体的指针,如下所示:
struct person *p = container_of(ptr, struct person, list);
通过这样的方式,我们可以在链表中通过节点指针获取整个结构体,并进行相应的操作。这在Linux内核中经常使用,特别是在处理链表和数据结构时。