2009年10月20日星期二

All about container_of

对一个这个宏的不理解导致了几个晚上的熬夜。写代码的时候一定不能迷糊阿!

这个是Linux kernel里面的宏, 作用大概如下, 现在你有一个


struct big{
struct small sname_in_big;
int some_else
};

struct small{}


然后有一个函数, 传入参数只有一个*small, 比如

void some_func(struct small *s);


在这个函数里面, 你想作这么一件事情, 想得到那个int some_else的值是多少, 而你的函数只有一个struct small* 的参数, 所以kernel里面就有这么一个函数可以帮你获得 struct big的指针。
就是container_of
在这个函数里面可以这样用:
 void some_func(struct small *s) {
struct big *b;
b = container_of (s, struct big, sname_in_big);
}

不过, 还有一个更重要的前提。 就是, 这个函数的参数的这个s,必须是struct big的一部分。 也就是说, 必须有这样一个步骤, struct big a; a.sname_in_big = some_small.
some_func(&a.sname_in_big);
才可以找到big的正确的地址。

这里的解释更详细:
http://www.kroah.com/log/linux/container_of.html

1 条评论:

coder 说...

笨笨