那么nginx如何改变流程标题呢?

时间:2011-06-01 13:38:09

标签: c nginx

此函数实现API以更改流程标题:

http://lxr.evanmiller.org/http/source/os/unix/ngx_setproctitle.c

59     for (i = 0; environ[i]; i++) {
 60         if (ngx_os_argv_last == environ[i]) {
 61 
 62             size = ngx_strlen(environ[i]) + 1;
 63             ngx_os_argv_last = environ[i] + size;
 64 
 65             ngx_cpystrn(p, (u_char *) environ[i], size);
 66             environ[i] = (char *) p;
 67             p += size;
 68         }
 69     }
 70 
 71     ngx_os_argv_last--;
 72 
 73     return NGX_OK;
 74 }

我不明白的是,在将环境变量复制到由ngx_alloc(size, log);分配的块之后,该块如何与argv[]块相关联?

我在那里看不到这样的逻辑。

还有一条我不明白的路线:

ngx_os_argv_last--;

这是什么,是这条线将分配的块与argv[]连接?

1 个答案:

答案 0 :(得分:1)

模块开头的评论似乎解释了很多,你读过吗?

http://lxr.evanmiller.org/http/source/os/unix/ngx_setproctitle.c#L14

ngx_init_setproctitle()函数似乎只是设置了用于设置流程标题的内存,并且没有对标题进行实际更改。模块开头的注释表明它需要设置内存来设置进程标题,因为argv [0]可能没有新标题的空间(这是为了更改标题需要设置的空间)

ngx_os_argv_last变量只是指向argv[]environ[]的连续数据块的末尾。它稍后在ngx_setproctitle()的复制过程中使用。最后一个ngx_os_argv_last--可能会考虑到字符串末尾的'\0'

ngx_init_setproctitle()使用ngx_alloc()创建空格,然后将environ[]复制到新空间。 ngx_setproctitle()函数只需使用新值ngx_os_argv[0]复制title