看到时:
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
。
答案 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
是一个宏,它可以完成看似不可能的事情(对于不习惯元编程的开发人员)。