nginx源码解析-ngx_get_options()

来源:互联网 发布:电影没字幕翻译软件 编辑:程序博客网 时间:2024/05/17 21:59

nginx源码解析-ngx_get_options()

/* * 解析者 : wenpeng_lu * 时间   :2017/4/8 * 功能   : 获取命令行参数 * 参数   : main()传递过来的参数 * 返回值 : NGX_OK(0)     成功 *          NGX_ERROR(-1) 失败 */static ngx_int_tngx_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)        {            // 注意*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)                    {                        // 形如-p/usr/local/nginx/                        ngx_prefix = p;                        goto next;                    }                    if (argv[++i])                    {                        // 形如-p /usr/local/nginx/                        ngx_prefix = (u_char *) argv[i];                        goto next;                    }                    // 错误信息显示到控制台                    ngx_log_stderr(0, "option \"-p\" requires directory name");                    return NGX_ERROR;                case 'c':                    // 配置文件路径(相对于安装路径)                    if (*p)                    {                        // 形如-c/conf/nginx.conf                        ngx_conf_file = p;                        goto next;                    }                    if (argv[++i])                    {                        // 形如-c /conf/nginx.conf                        ngx_conf_file = (u_char *) argv[i];                        goto next;                    }                    ngx_log_stderr(0, "option \"-c\" requires file name");                    return NGX_ERROR;                case 'g':                    /*                     * 另行指定全局配置项的启动方式                     * -g参数的约束条件是指定的配置项不能与默认路径下的nginx.conf中的配置项相冲突,否则无法启动                     * 另一个约束条件是, 以-g方式启动的Nginx服务执行其他命令行时,需要把-g参数也带上,否则可能出现配置项不匹配的情形                     */                    if (*p)                    {                        // 形如-gpid/var/nginx/test.pid;                        ngx_conf_params = p;                        goto next;                    }                    if (argv[++i])                    {                        // 形如-g pid/var/nginx/test.pid;                        ngx_conf_params = (u_char *) argv[i];                        goto next;                    }                    ngx_log_stderr(0, "option \"-g\" requires parameter");                    return NGX_ERROR;                case 's':                    // 发送信号给管理进程                    if (*p)                    {                        // 形如-sstop                        ngx_signal = (char *) p;                    }                    else if (argv[++i])                    {                        // 形如-s stop                        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;}
0 0
原创粉丝点击