您现在的位置是:首页 >技术杂谈 >Ubuntu 下 nginx-1.24.0 源码分析 - ngx_get_options函数网站首页技术杂谈
Ubuntu 下 nginx-1.24.0 源码分析 - ngx_get_options函数
简介Ubuntu 下 nginx-1.24.0 源码分析 - ngx_get_options函数
声明
就在 main函数所在的 nginx.c 中:
static ngx_int_t ngx_get_options(int argc, char *const *argv);
实现
static ngx_int_t ngx_get_options(int argc, char *const *argv) { u_char *p; ngx_int_t i; for (i = 1; i < argc; i++) { p = (u_char *) argv[i]; if (*p++ != '-') { ngx_log_stderr(0, "invalid option: "%s"", argv[i]); return NGX_ERROR; } while (*p) { switch (*p++) { case '?': case 'h': ngx_show_version = 1; ngx_show_help = 1; break; case 'v': ngx_show_version = 1; break; case 'V': ngx_show_version = 1; ngx_show_configure = 1; break; case 't': ngx_test_config = 1; break; case 'T': ngx_test_config = 1; ngx_dump_config = 1; break; case 'q': ngx_quiet_mode = 1; break; case 'p': if (*p) { ngx_prefix = p; goto next; } if (argv[++i]) { ngx_prefix = (u_char *) argv[i]; goto next; } ngx_log_stderr(0, "option "-p" requires directory name"); return NGX_ERROR; case 'e': if (*p) { ngx_error_log = p; } else if (argv[++i]) { ngx_error_log = (u_char *) argv[i]; } else { ngx_log_stderr(0, "option "-e" requires file name"); return NGX_ERROR; } if (ngx_strcmp(ngx_error_log, "stderr") == 0) { ngx_error_log = (u_char *) ""; } goto next; case 'c': if (*p) { ngx_conf_file = p; goto next; } if (argv[++i]) { ngx_conf_file = (u_char *) argv[i]; goto next; } ngx_log_stderr(0, "option "-c" requires file name"); return NGX_ERROR; case 'g': if (*p) { ngx_conf_params = p; goto next; } if (argv[++i]) { ngx_conf_params = (u_char *) argv[i]; goto next; } ngx_log_stderr(0, "option "-g" requires parameter"); return NGX_ERROR; case 's': if (*p) { ngx_signal = (char *) p; } else if (argv[++i]) { ngx_signal = argv[i]; } else { ngx_log_stderr(0, "option "-s" requires parameter"); return NGX_ERROR; } if (ngx_strcmp(ngx_signal, "stop") == 0 || ngx_strcmp(ngx_signal, "quit") == 0 || ngx_strcmp(ngx_signal, "reopen") == 0 || ngx_strcmp(ngx_signal, "reload") == 0) { ngx_process = NGX_PROCESS_SIGNALLER; goto next; } ngx_log_stderr(0, "invalid option: "-s %s"", ngx_signal); return NGX_ERROR; default: ngx_log_stderr(0, "invalid option: "%c"", *(p - 1)); return NGX_ERROR; } } next: continue; } return NGX_OK; }
它的任务是解析用户在命令行中输入的参数。
static ngx_int_t ngx_get_options(int argc, char *const *argv)
static
:这个关键字表示这个函数只能在当前文件中使用,外面的文件不能直接调用它。
ngx_int_t
:这是一个自定义的整数类型,用来表示函数的返回值
argc
:表示命令行参数的个数,比如你输入了nginx -h -v
,那么argc
就是 3(包括程序名和两个参数)(和main
函数的argc
一致)。
argv
:是一个数组,存储了所有命令行参数的内容。(和main
函数的argv
一致)返回值:成功返回
NGX_OK
,失败返回NGX_ERROR
。
#define NGX_OK 0 #define NGX_ERROR -1
这2个宏的定义都在 ngx_core.h 中
{ u_char *p; ngx_int_t i;
u_char
:这是一个无符号字符类型,用来存储单个字符。
p
:是一个指针,用来逐个检查命令行参数中的每个字符。
i
:是一个循环变量,用来遍历所有的命令行参数。
for (i = 1; i < argc; i++) {
这是一个循环,从
i = 1
开始,因为argv[0]
是程序名,我们从第一个参数开始检查。循环会一直进行,直到检查完所有的参数。
p = (u_char *) argv[i];
把当前参数的内容赋给指针
p
,这样就可以逐个字符检查这个参数了。
if (*p++ != '-') { ngx_log_stderr(0, "invalid option: "%s"", argv[i]); return NGX_ERROR; }
检查参数的第一个字符是否是
-
,因为命令行参数通常以-
开头,比如-h
。如果不是
-
,就说明这个参数格式不对,打印错误信息,并返回错误码NGX_ERROR
。
ngx_log_stderr 函数
while (*p) {
这是一个循环,用来逐个字符检查参数的内容,直到遇到字符串的结尾(
*p
为