어떤 구조체 내의 내부 포인터를 알고 있을때, 해당 구조를 포함하는 상위 구조체의 정보를 참조할때 유용한 Kernel API이다.
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
3개의 매개변수
#define container_of(멤버포인터, 구조체 원형, 구조체 멤버 종류)
/*
* member가 type의 포인터 멤버일때 container_of를 어떻게 사용하는가????
**/
## 1
#include <stdio.h>
#define offsetof(type, member) ((size_t) &((type *)0)->member)
#define container_of(ptr, type, member) ({ \
const typeof( ((type *)0)->member ) *__mptr = (ptr); \
(type *)( (char *)__mptr - offsetof(type,member) );})
struct te {
int t;
} data;
struct type
{
char ttt;
int *member;
struct te *d;
} con;
int main()
{
con.d = &data;
printf("%p\n", &con);
printf("%p\n", container_of(&(con.member), struct type, member));
printf("%p\n", &con);
printf("%p\n", container_of(&(con.d), struct type, d));
return 0;
}