此函数实现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[]
连接?
答案 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
。