lwn.net中的container_of示例代码

时间:2018-08-29 06:03:04

标签: c linux-kernel

看到时:

void my_object_release(struct kobject *kobj)
{
   struct my_object *mine = container_of(kobj, struct my_object, kobj);

   /* Perform any additional cleanup on this object, then... */
   kfree (mine);
}

LWN’s The zen of kobjects中,在第三个参数kobj中似乎不正确。我认为应该是kobject

1 个答案:

答案 0 :(得分:1)

给定的代码是正确的:第三个参数是指针指向的容器结构成员的名称,而不是其类型,因此kobj是正确的。该示例有些混乱,因为第一个kobj与第二个kobj并不相同:第一个是调用者作用域中的指针。

以下是希望阐明container_of参数的图表:

container_of(kobj, struct my_object, kobj)
              |            |          |
              |            |          |
              \------------+----------+--------------------------------\
                           |          |                                |
                           |          |                                |
         /-----------------/          |                                |
         |                            |                                |
         V              /-------------/                                |
+------------------+    |                                              |
| struct my_object | {  |                                              |
+------------------+    V                                              V
                   +------+                                         +------+
    struct kobject | kobj |; <-- You have a pointer to this, called | kobj |
                   +------+                                         +------+
    ...
};

container_of允许您传递kobject指针并找到包含的对象(只要您知道包含的对象是什么)-它使您可以利用“什么”知识来回答“哪里”。

值得指出的是,container_of是一个宏,它可以完成看似不可能的事情(对于不习惯元编程的开发人员)。