Here iam giving a small code snippet that gives and idea about working of "container_of", this posed me little difficulty in understanding, after google-ing i got some examples and after working on that i wrote a simple C application that depicts its working. here i have defined two macros "offsetof" and "container_of" which i have extracted from "kernel.h" header.
Please interpret this code and try some trick to understand "container_of".
container_of macro is defined in linux/kernel.h
syntax: container_of( pointer, container_type, container_field );
This macro takes a pointer to a filed name container_field, within a structure of type container_type, and returns a pointer to the containing structure .
simply this is a convenience macro that may be used to obtain a pointer to a structure from a pointer to some other structure contained with in it.
Code :
#include <stdio.h> #include <stdlib.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 test1 { int a; }; struct test2 { int b; struct test1 z; int c; }; int main() { /* existing structure */ struct test2 *obj; obj = malloc(sizeof(struct test2)); if(obj == NULL){ printf("Error: Memory not allocated...!\n"); } obj->z.a = 51; obj->b = 43; obj->c = 53; /* pointer to existing entry */ struct test1 *obj1 = &obj->z; struct test2 *obj2 = container_of(obj1, struct test2, z); printf("obj2->b = %d\n", obj2->b); return EXIT_SUCCESS; }
Note: Copying the code directly into your source.c file will also copies the invisible characters and finally you will left out with stray errors, i recommend you to type the code and that even becomes a practice.
for more information check out this : http://www.kroah.com/log/linux/container_of.html
nice example.
ReplyDeleteGood Work.
ReplyDeletevery nice
ReplyDeleteGreat, Excellent job
ReplyDeleteBeautifully!
ReplyDeleteMakes things very clear
ReplyDeletehi am trying to execute the above code in my PC..i am facing following problem:
ReplyDeleteerror: expected expression before 'struct'
can u please help me why this problem am facing. even though have written code as it is.