c - 那么nginx是如何改变进程标题的呢?

标签 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); 分配的 block 之后,该 block 如何与 argv[] 连接> 阻止?

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

有一行我不明白:

ngx_os_argv_last--;

它是做什么用的,这条线是将分配的 block 与argv[]连接起来的吗?

最佳答案

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

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

看起来ngx_init_setproctitle()函数只是设置了用于设置进程标题的内存,并且没有对标题进行真正的更改。模块开头的注释指出,它需要设置内存来设置进程标题,因为 argv[0] 可能没有用于新标题的空间(这是更改标题需要设置的空间) .

ngx_os_argv_last 变量只是指向 argv[]environ[] 的连续 block 的末尾。稍后在 ngx_setproctitle() 的复制过程中使用它。最后一个 ngx_os_argv_last-- 可能是为了解释字符串末尾的 '\0'

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

关于c - 那么nginx是如何改变进程标题的呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6202070/

相关文章:

c++ - 我们可以使用单个指针实现双向链表吗?

c - 在 C 中初始化二维数组

regex - 带有 map 和正则表达式的动态 proxy_pass

ssl - nginx ssl_certificate 指令在服务器 block 内不起作用,浏览器显示 ERR_CONNECTION_CLOSED 或 ERR_CONNECTION_RESET

计算 C 的时间差(天、小时、分钟、秒)

php - 执行带有 "Program execution Functions"的二进制字符串(exec、system 等...)

c - 我如何摆脱这个c程序中的提示?

ubuntu - Mono 3.0、Ubuntu 12.10、Nginx 和 ServiceStack

image - 我启动Docker容器后立即退出

ubuntu - Nginx 守护进程停止失败