您的位置:首页 > 运维架构 > Nginx

nginx 改变标题 ngx_setproctitle

2016-07-27 16:22 399 查看
原理参见:http://blog.csdn.net/hengshan/article/details/7835981

主要两个函数:

ngx_int_t

ngx_init_setproctitle(ngx_log_t *log) {

u_char *p;

size_t size;

ngx_uint_t i;

size = 0;

// 计算环境变量的长度

for (i = 0; environ[i]; i++) {

size += ngx_strlen(environ[i]) + 1; // 加1是因为ngx_strlen不计算\0的长度

}

p = ngx_alloc(size, log); // 开辟一个新的内存段,来放环境变量

if (p == NULL) {

return NGX_ERROR;

}

// 让ngx_os_argv_last指向环境变量

ngx_os_argv_last = ngx_os_argv[0];

for (i = 0; ngx_os_argv[i]; i++) {

if (ngx_os_argv_last == ngx_os_argv[i]) {

ngx_os_argv_last = ngx_os_argv[i] + ngx_strlen(ngx_os_argv[i]) + 1;

}

}

// 将环境变量的值放到新的内存段

for (i = 0; environ[i]; i++) {

if (ngx_os_argv_last == environ[i]) {

size = ngx_strlen(environ[i]) + 1;

ngx_os_argv_last = environ[i] + size;

ngx_cpystrn(p, (u_char *) environ[i], size);
environ[i] = (char *) p;
p += size;
}


}

// 让ngx_os_argv_last 停在’\0’的位置上,方便后面计算长度

ngx_os_argv_last–;

return NGX_OK;

}

// 这个函数,我只取了linux系统部分的

void

ngx_setproctitle(char *title) {

u_char *p;

ngx_os_argv[1] = NULL;

// ngx_os_argv_last是个全局变量,在调用ngx_init_setproctitle后才会调用ngx_setproctitle,

// 调用ngx_init_setproctitle后, ngx_os_argv_last是停在最后一个字节,即‘\0’上,所以

// ngx_os_argv_last - ngx_os_argv[0]是内存段的长度

p = ngx_cpystrn((u_char ) ngx_os_argv[0], (u_char ) “nginx: “,

ngx_os_argv_last - ngx_os_argv[0]);

p = ngx_cpystrn(p, (u_char *) title, ngx_os_argv_last - (char *) p);

if (ngx_os_argv_last - (char *) p) {
ngx_memset(p, NGX_SETPROCTITLE_PAD, ngx_os_argv_last - (char *) p);
}

ngx_log_debug1(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0,
"setproctitle: \"%s\"", ngx_os_argv[0]);


}

上面的原理就是将环境变量移到其他地方,这样就可以把原来用来放环境变量的内存段也用来放名字。但这样,还是解决不了名字特别长的情况(名字的长度,即使加上放环境变量的内存段,也放不下)。但一般情况是可以处理的

有人肯定会想为什么不把放名字的这块内存放大,以至于能放下名字。原因是这样,这块内存是操作系统开辟的,约定好了程序的名字就在这里取,那么现在的方法就是发大这块内存,就是把放名字的内存后面的一段内存也分配给放名字的内存。这里就涉及到两个问题。

1:怎么分配一块更大的内存,并且这块内存的首地址跟原来的一样?

2:如果后面的内存已经被使用了,怎么办?

对于第一个问题,我没有找到可以在指定的位置分配内存的函数。

第二个问题,假如有一个函数可以在指定的位置分配内存,那么面对第二个问题,也是没有办法的。

所以nginx就只能这么做了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  nginx