Welcome 微信登录
编程资源 图片资源库 蚂蚁家优选 PDF转换器

首页 / 操作系统 / Linux / Nginx 中 ngx_queue中的一点理解

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 的首地址.