设为首页 收藏本站
查看: 354|回复: 0

[经验分享] Nginx源码完全注释(9)nginx.c: ngx_get_options

[复制链接]

尚未签到

发表于 2016-12-24 07:36:18 | 显示全部楼层 |阅读模式
Nginx源码完全注释(9)nginx.c: ngx_get_options


  • 作者:柳大·Poechant(钟超)
  • 博客:Blog.CSDN.net/Poechant
  • 邮箱:zhongchao.ustc#gmail.com (# -> @)
  • 日期:2012/09/29

本文分析 ngxin.c 中的 ngx_get_options 函数,其影响:
nginx.c 中的:


static ngx_uint_t   ngx_show_help;
static ngx_uint_t   ngx_show_version;
static ngx_uint_t   ngx_show_configure;
static u_char      *ngx_prefix;
static u_char      *ngx_conf_file;  
static u_char      *ngx_conf_params;   
static char        *ngx_signal;

ngx_cycle.c 中的:


ngx_uint_t             ngx_test_config;
ngx_uint_t             ngx_quiet_mode;

ngx_process_cycle.c(src/os/win32 或 src/os/unix)中的:


ngx_uint_t    ngx_process;

这些变量的作用域由 static 限制为 nginx.c 文件。ngx_get_options 函数如下:


// 传入的是 main 函数的两个参数 argc 和 argv
static ngx_int_t
ngx_get_options(int argc, char *const *argv)
{
u_char     *p;
ngx_int_t   i;
// 对于每一个 argv(注意是从 1 开始,因为 0 是 "nginx")
for (i = 1; i < argc; i++) {
// p 为第 i 个参数的地址
p = (u_char *) argv;
//
if (*p++ != '-') {
ngx_log_stderr(0, "invalid option: \"%s\"", argv);
return NGX_ERROR;
}
// 之所以 while 循环是因为一个减号可以带过个参数,比如 -hV
while (*p) {
// 注意 p 被加 1
switch (*p++) {
// 问号和 h 都是显示帮助信息和版本信息
case '?':
case 'h':
ngx_show_version = 1;
ngx_show_help = 1;
break;
// 小 v 显示版本信息
case 'v':
ngx_show_version = 1;
break;
// 大 v 显示版本信息和配置信息
case 'V':
ngx_show_version = 1;
ngx_show_configure = 1;
break;
// t 用于测试配置文件
case 't':
ngx_test_config = 1;
break;
// q 表示安静模式
case 'q':
ngx_quiet_mode = 1;
break;
// p 为指定 prefix path
case 'p':
if (*p) {
ngx_prefix = p;
goto next;
}
if (argv[++i]) {
ngx_prefix = (u_char *) argv;
goto next;
}
ngx_log_stderr(0, "option \"-p\" requires directory name");
return NGX_ERROR;
// 使用指定的配置文件
case 'c':
if (*p) {
ngx_conf_file = p;
goto next;
}
if (argv[++i]) {
ngx_conf_file = (u_char *) argv;
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;
goto next;
}
ngx_log_stderr(0, "option \"-g\" requires parameter");
return NGX_ERROR;
// s 为 signal,即给 Nginx 发送信号
case 's':
if (*p) { // 下一个参数紧跟在 -s 后,比如 -sstop
ngx_signal = (char *) p;
} else if (argv[++i]) { // 下一个参数
ngx_signal = argv;
} else { // -s 没有带参数时
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;
}

帮助信息如下:

Options:
-?,-h         : this help
-v            : show version and exit
-V            : show version and configure options then exit
-t            : test configuration and exit
-q            : suppress non-error messages during configuration testing
-s signal     : send signal to a master process: stop, quit, reopen, reload
-p prefix     : set prefix path (default: /usr/local/nginx/)
-c filename   : set configuration file (default: conf/nginx.conf)
-g directives : set global directives out of configuration file

v 版本信息形式如下:

nginx version: nginx/1.3.5

V 版本信息如下:

nginx version: nginx/1.3.5
built by gcc 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)
configure arguments: --with-pcre=/home/michael/packages.d/pcre-8.20 --with-zlib=/home/michael/packages.d/zlib-1.2.7

-
转载请注明来自柳大·Poechant(钟超)的CSDN博客
-

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-318533-1-1.html 上篇帖子: PHP+NGINX+WIN 批处理脚本 下篇帖子: nginx系列(九)nginx的浏览器缓存首部设置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表