《深入理解linux内核》中hlist描述的疑问

以下是写给陈老师的一份邮件:


陈老师:
之前我仔细研究了list.h头文件,网上关于list链表描述很多,但是hlist链表的描述比较少。我自己把hlilst好好的也研究了一番,但是不知道自己的理解是不是正确的,上周一晚上讲座的时候,有一个细节问题:发现老师的《深入理解linux内核》(第3版)中的第93页中关于hlist和我讲的hlist有些差异。
老师书中93页中间有这么一句“第一个元素的pprev字段和最后一个元素的next字段都置为NULL”。书中的意思就是说,hlist的下一个节点(也就是hlist的第一个元素)的pprev指向的是空。
按照这种理解,当只有一个元素的时候,就是附件hlist1当中图片所描述的那样。


但是我的研究结果是附件二当中的那样。

我做了一个测试:
为了验证我的想法,可以开始假设这个hlist链表只有一个头结点head(struct hlist_head类型),经过初始化之后,head->first是NULL,然后我们可以申请一个新的struct hlist_node类型的节点n,然后调用
list_add_head(n, head),进行头插,插入之后的结果就是附件当中hlist2.png的结果。
具体的实现代码可以这样来设计:

HLIST_HEAD(head);
struct hlist_node n;
INIT_HLIST_NODE(&n);
hlist_add_head(n, head);

其中涉及到的宏定义和函数:
#define HLIST_HEAD(name) struct hlist_head name = {  .first = NULL }
static inline void INIT_HLIST_NODE(struct hlist_node *h)
{
   h->next = NULL;
   h->pprev = NULL;
}
  1. static inline void hlist_add_head(struct hlist_node *n, struct hlist_head *h)
  2. {
  3.     struct hlist_node *first = h->first;
  4.     n->next = first;
  5.     if (first)
  6.         first->pprev = &n->next;
  7.     h->first = n;
  8.     n->pprev = &h->first;
  9. }
 

我的结论:整个hlist链表的组织方式,我认为,第一个元素的pprev指向的不是NULL,而是头结点的first的地址;最后一个元素的next才指向的是NULL。
完整的组织方式是附件3当中的hlist.jpg.

不知道我这样的理解哪里出现了问题?
请大家帮忙分析一下~~~
阅读(3813) | 评论(0) | 转发(0) |
0

上一篇:文件描述符和文件指针的区别与联系

下一篇:内存溢出与内存泄漏

相关热门文章
  • Python 包管理工具解惑
  • APP开发流程,你知道多少...
  • 《深入Linux设备驱动程序机制...
  • QEMU源码分析系列(二)
  • ZIP压缩算法详细分析及解压实...
  • linux 常见服务端口
  • xmanager 2.0 for linux配置
  • 【ROOTFS搭建】busybox的httpd...
  • openwrt中luci学习笔记
  • 什么是shell
  • linux dhcp peizhi roc
  • 关于Unix文件的软链接
  • 求教这个命令什么意思,我是新...
  • sed -e "/grep/d" 是什么意思...
  • 谁能够帮我解决LINUX 2.6 10...
给主人留下些什么吧!~~
评论热议

你可能感兴趣的:(LINUX)