ngx_save_argv方法在src/core/nginx.c中定义, 用于备份参数到init_cycle中。
该函数主要作用就是将参数个数以及参数的信息备份在ngx_argc和ngx_argv变量中, 这两个变量是在 src/os/unix/ngx_process.c中定义的。
int ngx_argc;
char **ngx_argv;
char **ngx_os_argv;
下面是该函数的详细代码:
static ngx_int_t
ngx_save_argv(ngx_cycle_t *cycle, int argc, char *const *argv)
{
#if (NGX_FREEBSD)
ngx_os_argv = (char **) argv;
ngx_argc = argc;
ngx_argv = (char **) argv;
#else
size_t len;
ngx_int_t i;
ngx_os_argv = (char **) argv;
ngx_argc = argc;
ngx_argv = ngx_alloc((argc + 1) * sizeof(char *), cycle->log);
if (ngx_argv == NULL) {
return NGX_ERROR;
}
for (i = 0; i < argc; i++) {
len = ngx_strlen(argv[i]) + 1;
ngx_argv[i] = ngx_alloc(len, cycle->log);
if (ngx_argv[i] == NULL) {
return NGX_ERROR;
}
(void) ngx_cpystrn((u_char *) ngx_argv[i], (u_char *) argv[i], len);
}
ngx_argv[i] = NULL;
#endif
ngx_os_environ = environ;
return NGX_OK;
}
其中ngx_alloc方法 是对底层操作系统的内存分配方法malloc()的一种包装。
void *
ngx_alloc(size_t size, ngx_log_t *log)
{
void *p;
//从这里可以看到,ngx_alloc实际上就是调用malloc函数分配内存的。
p = malloc(size);
if (p == NULL) {
ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
"malloc(%uz) failed", size);
}
ngx_log_debug2(NGX_LOG_DEBUG_ALLOC, log, 0, "malloc: %p:%uz", p, size);
return p;
}