Linux中的list_entry

lik*_*eIT 26 c linux linux-kernel

user/include/linux/list.h
Run Code Online (Sandbox Code Playgroud)

本声明:

#define list_entry(ptr, type, member) \
((type *)((char *)(ptr) – (unsigned long)(&((type *)0)->member)))
Run Code Online (Sandbox Code Playgroud)

有人可以解释这是什么以及它是如何工作的,提前谢谢

PS请尽可能地简化你的答案,我知道Linux中的线程,进程,现在我正在探索可能性,而且我有点困惑于这个.

Pet*_*nen 29

考虑两个这样的结构:

struct data {
    int something;
};

struct container {
    int something_before;
    struct data data_item;
    int something_after;
};
Run Code Online (Sandbox Code Playgroud)

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

struct data *data_ptr;
Run Code Online (Sandbox Code Playgroud)

list_entry()宏可以帮助您转换data_ptr为指向struct container保存struct data值的值的指针,指向ptr:

struct container *cont_ptr = list_entry(data_ptr, struct container, data_item);
Run Code Online (Sandbox Code Playgroud)

宏通过计算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)))
Run Code Online (Sandbox Code Playgroud)