Nginx 中 ngx_queue中的一点理解

本文解析了Nginx中ngx_queue数据结构的使用方法,并详细解释了如何通过ngx_queue_data宏从队列元素获取到实际的数据结构指针。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

ngx_queue的定义

 

typedef struct ngx_queue_s  ngx_queue_t;

struct ngx_queue_s {

    ngx_queue_t  *prev;

    ngx_queue_t  *next;

};

 

 

在Wiki的"Nginx代码研究"中看到ngx_queue 的如下用法,刚开始颇有点不解,

 

typedef struct yahoo_s {

ngx_queue_t queue;

} yahoo_t;

 

typedef struct yahoo_guy_s {

ngx_unit_t id;

u_char* name;

ngx_queue_t queue;

} yahoo_guy_t;

......

yahoo_guy_t*    guy;

ngx_queue_t*    q;

yahoo_t*        yahoo;

......

ngx_queue_init(&guy->queue);

ngx_queue_insert_head(&yahoo->queue, &guy->queue);

......

guy = ngx_queue_data(q, yahoo_guy_t, queue);

......

 

我疑惑的是,为什么插入队列中的是 &guy->queue, 而出来的却是 guy 呢?

 

首先, 看ngx_queue_data()的定义:

#define ngx_queue_data(q, type, link)                                         /

    (type *) ((u_char *) q - offsetof(type, link))

 

而宏offsetof的定义为:

#define offsetof(s, m)   (size_t)&(((s *)0)->m)

 

至此清楚, 原来进入yahoo->queue中的只是 guy->queue的地址值, guy的

实际内容在pool中,通过offsetof宏取得&guy->queue的在相应guy的偏移

值, 再用guy->queue的地址减去偏移值即为guy 的首地址.

 

相关链接:

Wiki的"Nginx代码研究" 

C语言中offsetof宏的应用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值