Nginx 中 ngx_queue中的一点认识
发布时间:2021-11-25 20:41:44 所属栏目:教程 来源:互联网
导读: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;
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 的首地址. ![]() (编辑:江门站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |