一尘不染

Linux中的list_entry

linux

user/include/linux/list.h

此声明:

#define list_entry(ptr, type, member) \
((type *)((char *)(ptr) – (unsigned long)(&((type *)0)->member)))

有人可以解释一下这是什么以及它是如何工作的,在此先感谢

PS请尽可能简化您的答案,我了解Linux中的线程,进程,现在我正在探索各种可能性,而我对此有些犹豫。


阅读 332

收藏
2020-06-03

共1个答案

一尘不染

考虑如下两个结构:

struct data {
    int something;
};

struct container {
    int something_before;
    struct data data_item;
    int something_after;
};

假设您有一个指向struct data值的指针:

struct data *data_ptr;

list_entry()宏可以帮助你转换data_ptr到一个指针struct container保存的值struct data值,指向ptr

struct container *cont_ptr = list_entry(data_ptr, struct container, data_item);

宏作品通过计算的偏移量data_item内的struct container,并从中减去很多字节data_ptr指针。当将struct container *其强制转换为时,会给出指向struct container持有此特定struct data“内部”的的有效指针。

也可以使用内置offsetof()宏来简化该宏:

#define list_entry(ptr, type, member) \
    ((type *)((char *)(ptr) – offsetof(type, member)))
2020-06-03