`
cloudtech
  • 浏览: 4611460 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

关于nginx中的四级指针

 
阅读更多
在nginx中有个四级指针,void ****conf_ctx,那么这个四级的指针在什么情况下用到呢?
答案可以在events block中找到。
在处理events这个指令时,它在conf_ctx中某个地方占住一个位置(指针看成数组),以index代表此处的下标。
在ngx_events_block函数中,先会申请一个指针,即代码中的ctx:
ctx = ngx_pcalloc(cf->pool, sizeof(void *));
这个指针后面就会放到index下标处。那么这个指针ctx,指向的是什么呢?那是个数组,各种event的配置的结构指针数组,从c语言上看,假设我们用一个void **tmp的二级指针来指向这个数组:
tmp = ngx_pcalloc(cf->pool, ngx_event_max_module * sizeof(void *));
*ctx = tmp;
我们看到此时ctx就是一个指向二级指针的指针,即void ***,而这个ctx又是conf_ctx的一个成员,很显然,conf_ctx被冠以void ****也理所当然。

而evnents是个MAIN_CONF(关于什么是MAIN_CONF,自己去查查这里就不说了),所以在解析时(即ngx_conf_handler),取到该index所在位置的地址:
conf = &(((void **) cf->ctx)[ngx_modules[i]->index])
这个conf,通过后面:
cmd->set(cf, cmd, conf);
即调用ngx_events_block时,通过:
*(void **) conf = ctx;
完成了index位置上面指针的放置,这个有C语言基础的同学都知道的,在函数内部给外面指针参数赋值的原理。

现在的问题是为什么非要用void ****,void *不可以吗?从语言层面来说,是可以的。我个人认为,把指针层次写全,对用户(或者是代码逻辑上层)来说,容易看到它的指向和层次。而写成void *,那么只是在实际使用者,根据需要时候来做类型强转,在其他的地方,看不出它的层次。

以上是我个人的理解,有其他见解的朋友欢迎一起讨论。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics