在Linux内核中有struct XX
,其中包含struct list_head YY
。
现在给出了一个指向struct XX
对象的指针,我想在链表中找到所有XX
结构。所以我将通过list_head结构,然后找到相应的父结构。
但这里的第二步似乎不适用。所以我不确定是否有可能实现这一目标。
示例:
struct XX {
...
struct list_head YY;
};
答案 0 :(得分:4)
您应该使用container_of
宏(LDD3 chapter 3: The open method)。
答案 1 :(得分:0)
我想你是在问如何找到包含给定列表节点的对象(你有一个指针)。如果是这样,你想要这个宏的一些变体:
//given the address of a member, find the address of the object containing the member.
#define GetObjectFromMember(ObjectType,MemberName,MemberPointer) \
((ObjectType *)(((char *)MemberPointer) - ((char *)(&(((ObjectType *)0)->MemberName)))))
给一个struct Foo和一个成员m_bar,一个指针p,到一个实例的m_bar:
Foo *foo = GetObjectFromMember(Foo,m_bar,p);
ASSERT( &foo->m_bar == p );
我在大量的回调中使用这个宏,我将一个指向回调对象的指针(如计时器),并需要找到周围的对象指针。由于linux内核使用侵入式列表,我觉得它确实已经有了这个宏,但我从来没有真正寻找它。