c - Linux 中的列表条目

标签 c linux linux-kernel

user/include/linux/list.h

这个声明:

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

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

附:请尽可能简化您的回答,我了解 Linux 中的线程和进程,现在我正在探索各种可能性,但我有点受困于此。

最佳答案

考虑两个这样的结构:

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 数据的 struct container 值的指针 值,由 ptr 指向:

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

宏的工作原理是计算 struct containerdata_item 的偏移量,并从 data_ptr 指针中减去那么多字节。这在转换为 struct container * 时,提供了一个指向 struct container 的有效指针,该struct container “内部”保存了这个特定的 struct data

宏也可以通过使用内置的 offsetof() 宏来稍微简化:

#define list_entry(ptr, type, member) \
    ((type *)((char *)(ptr) – offsetof(type, member)))

关于c - Linux 中的列表条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5550404/

相关文章:

c - 当接口(interface)有 >1 个 IPv6 地址时 Linux IPv6 源地址选择 : How to deprecate one?

c - 在 Windows 上用 C 获取文件属性的正确方法是什么?

c - c中的自由函数

c - 指向 C 中字符串的字符数组的指针

linux - Tensorflow 填满内存

c - 从 C 代码打开 Linux 控制台

c - VC++ 内存分析器

linux - 连续打印标准输出并写入文件

ruby - 如何在 Ruby 中为字符串设置颜色

android - 如何在 Android 的 libc 和 syscall 之间添加一个 C 程序?