nginx源码剖析(2)----从main()函数开始
来源:互联网 发布:游戏优化是看什么 编辑:程序博客网 时间:2024/05/29 16:58
http://www.cnblogs.com/sld666666/archive/2010/05/05/1728417.html
首先说下感受吧。
这个是对nginx的main()函数的简单的分析了,大致看了下nginx.c的代码,发现有如下几个特点:
一:高度模块化,唯一把多个模块串起来的就是ngx_cycle_s这个结构体。
二:重新定义,不管是数据类型,还是库函数,还是系统函数,其都给它们包装了下,
unix网络编程里面就提倡这种做法,并把之称之为包裹函数。
三:注释太少,虽说里面有些代码是自明的,但是并不是所有的代码都能直接表现出其意义。
也许是我水平不太高的原因吧。
四:代码干净,简洁干练,这个只是我的主观的观点,呵呵,没有论证。
在这里,只是总体浏览了一下,没深入到代码细节上,如果以上或以下有错误的观点,望指教。
Let's begin!
在开始分析main函数的代码以前必 须了解一下一个典型的服务器的运行方式。
一个简单而有代表性的服务器程序的伪代码如下:
代码 struct sockaddr_in servaddr cliaddr; int listenfd = socket(AF_INET, SOCK_STREAM,0);bind(listenfd, (struct sockaddr_in*)(&servaddr), sizeof(servaddr)); listen(listenfd, 22); for (;;) { int clielen = sizeof(cliaddr); int connfd = accept(listenfd, (strct sockaddr_in)(&cliaddr), & clielen ); if( 0 == fork()) I_will_do_something();}
nginx作为一个http服务器当然不能免俗了。整个mian()算上空行200行左右,有效代码当然更少了。
好吧,现在来看看mian函数干了什么了。
main(int argc, char *const *argv) { ngx_int_t i; ngx_log_t *log; ngx_cycle_t *cycle, init_cycle; ngx_core_conf_t *ccf; ngx_get_options(argc, argv); /*根据参数,选定一实现什么功能,在此函数里面有对几个全局变量的 处理*/ if (ngx_show_version) {/*这个ngx_show_version就是函数ngx_get_options的处理结果了*/ I_will_show_information; } ngx_time_init();/*服务器时间的初始化*/ ngx_pid = ngx_getpid();/*得到进程id*/ log = ngx_log_init(ngx_prefix);/*服务器怎么能不写log呢,初始化之*/ ngx_memzero(&init_cycle, sizeof(ngx_cycle_t));/*meset(init_cycle, 0 , sizeof(ngx_cycle_t))*/ init_cycle.log = log; ngx_cycle = &init_cycle; ngx_pagesize = 1024; init_cycle.pool = ngx_create_pool(1024, log); /*初始化init_cycle, init_cycle 是一个非常庞大struct,里面包含了内存池,log,array,list,event,套节字,主机名 等等一系列信息*/ ngx_add_inherited_sockets(&init_cycle);/*这里就是前面说的服务器接听套节字过程的封装了*/ ngx_os_status(cycle->log);/*还是写log*/ ngx_cycle = cycle; ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module); ngx_create_pidfile()/*还是往文件写log信息*/ /*这里省下几个错误处理的动作*/ ngx_single_process_cycle(cycle)/*我要处理东西了*/ return 0; }
0 0
- nginx源码剖析--从main函数开始
- nginx源码剖析(2)----从main()函数开始
- nginx源码剖析(2)----从main()函数开始
- nginx源码剖析 从main函数看nginx启动流程
- 菜鸟nginx源码剖析 框架篇(一) 从main函数看nginx启动流程
- 菜鸟nginx源码剖析 框架篇(一) 从main函数看nginx启动流程
- 从Main函数开始认识cRtmpServer (2)
- iOS 从main函数开始
- Nginx源码main函数解读
- Nginx源码main函数解读
- c程序从main函数开始执行?
- 1 从mysqld的main()函数开始
- C++01、从main函数开始
- 为什么c语言从main函数开始
- 从main函数开始学习kotlin
- Nginx源码阅读(main函数)
- Nginx源码剖析--ngx_http_optimize_servers函数分析
- [Tomcat6.0源码]从BootStrap的main开始
- oracle pctfree和pctused详解
- GNU GLOBAL Source Code Tag System浏览源码
- Quartz 框架 教程(中文版)2.2.x 之第六课 CronTrigger
- 什么是FC?如何避免FC的发生,另外FC发生时如何捕获相应的uncaught exception?
- 【前端开发】负值之美:负值在页面布局中的应用(CSS HTML)
- nginx源码剖析(2)----从main()函数开始
- Values下的文件种类简介
- linux内核互斥与同步
- http://www.uisdc.com/40-flexible-grid-tools#
- 优秀程序员不得不知道的20个位运算技巧
- 《UNIX网络编程》例子程序中所使用的包裹函数及部分常量
- Groovy 函数(方法)定义 和 应用
- 黑马程序员-自己总结的java学习笔记(8)网络编程
- 设备模型之sysfs,bus,device,driver源代码分析