当前位置: 首页 > 面试题库 >

Linux中的list_entry

董康平
2023-03-14
问题内容
user/include/linux/list.h

此声明:

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

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

PS请尽可能简化您的答案,我了解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 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)))


 类似资料:
  • 问题内容: 我设法进入Linux机器尝试此答案中建议的HotKey库。 我已经编译了示例代码,现在运行该程序,并收到以下消息: 我知道如何在Windows中处理此问题(仅通过将DLL添加到PATH env var中),但是我不确定Linux。 我已经阅读了有关LD_LIBRARY_PATH和其他一些env var的内容,但是我可以使其正常工作。 有什么建议吗? 编辑 经过mmyers的支持,确定问

  • 数字调查的主要问题是通过加密或任何其他格式保护重要证据或数据。 基本示例是存储密码。 因此,有必要了解Linux操作系统在数字取证实施中的使用,以保护这些有价值的数据。 所有本地用户的信息大多存储在以下两个文件中 - /etc/passwd etc/shadow 第一个是必需的,它存储所有密码。 第二个文件是可选的,它存储有关本地用户的信息,包括散列密码。 关于将密码信息存储在文件中的安全性问题出

  • 问题内容: 我想创建一个Web应用程序,该应用程序将允许用户上传一些C代码,并查看其执行结果(该代码将在服务器上编译)。用户不受信任,这显然会带来巨大的安全隐患。 因此,我需要为应用创建某种沙箱。在最基本的级别上,我想将对文件系统的访问限制在某些指定的目录中。我无法直接使用chroot jails,因为Web应用程序未以特权用户身份运行。我想设置监狱的suid可执行文件是一个选择。 上载的程序会很

  • 问题内容: Clang有一个非常酷的扩展,名为block,将真正的lambda函数机制带给了C。与block相比,gcc的嵌套函数非常有限。但是,尝试编译一个琐碎的程序: 与,我得到了 似乎我应该使用,但是后来我得到了 有什么提示吗? 问题答案: 在Ubuntu Linux上: : 编译: 工作良好。

  • 问题内容: 我正在将应用程序从Tru64移植到Linux,并且使用limits.h中定义的PID_MAX。Linux没有该定义。如何在不手工阅读的情况下在 c中 找到PID_MAX ?有图书馆吗? 问题答案: 默认值为32768,您可以在中读取系统上的值。 您可以在64位系统(最多2 22 = 4,194,304)上将值设置为更高,方法如下: 在这里阅读更多: http://www.cs.wisc

  • 问题内容: 有什么我可以用来查找目录的linux命令吗?我尝试打印出环境变量(“ env”),但找不到目录。 问题答案: 如果已设置,将打印该值。但是,如果您没有在启动脚本中手动设置它,则可能未设置。 如果您尝试了却找不到任何东西,则Java可能未安装在您的计算机上,或者至少不在您的路径中。根据您拥有的Linux发行版以及是否具有root用户访问权限,可以访问http://www.java.com