nginx 改变标题 ngx_setproctitle

原理参见: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就只能这么做了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值