nginx之main函数的解读(一)
2014-10-09 10:36
8323 查看
nginx函数的定义如下:
一返回值和调用类型:
首先要说,main函数的返回值是int型的,其调用方式是 ngx_cdecl,也就是C的默认调用方式,是被调用者清除堆栈。
二简单的数据类型解读:
ngx_int_t的定义是
ngx_uint_t 的定义是 uintptr_t 类似intptr_t是 unsigned long int类型的, log_level表示的是日志等级,比如警告,错误等等
ngx_open_file_t的定义是
这里面包含四个数据,fd自然就是文件描述符了,name也就是在文件系统中的文件名称,flush则就是函数指针,是不是写入日志的函数指针?data就是要写入的数据?
这里面的ngx_fd_t的定义就是 int类型的,也就是文件描述符
ngx_str_t的定义是
ngx_atomic_uint_t的定义是 typedef AO_t ngx_atomic_uint_t,但是笔者并不清楚AO_t的含义是什么..
现在说下ngx_log_handler_pt函数指针的定义
接下来说下ngx_cycle_t的数据类型
首先看看ngx_pool_s也就是ngx_pool_t的定义
ngx_pool_data_t的定义是:
ngx_buf_t的定义是
ngx_buf_t里面好多变量,但是现在还不知道具体是做什么的,于是乎,我们只能,开始进行下一部分了,继续探索。
ngx_pool_large_t的定义是
ngx_pool_cleanup_pt的定义是
int ngx_cdecl 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_debug_init(); if (ngx_strerror_init() != NGX_OK) { return 1; } if (ngx_get_options(argc, argv) != NGX_OK) { return 1; } ... }
一返回值和调用类型:
首先要说,main函数的返回值是int型的,其调用方式是 ngx_cdecl,也就是C的默认调用方式,是被调用者清除堆栈。
二简单的数据类型解读:
ngx_int_t的定义是
typedef intptr_t ngx_int_t;而 intptr_t则是 跨平台的始终与地址位数相同,也就是
typedef long int intptr_t;ngx_log_t的定义是
struct ngx_log_s{ ngx_uint_t log_level;//日志等级 ngx_open_file_t *file;//日志文件名称还是描述符? ngx_atomic_uint_t connection; ngx_log_handler_pt handler;//日志文件的操作函数指针 void *data;//用户操作对应的参数? char* action;//用户进行的操作 }
ngx_uint_t 的定义是 uintptr_t 类似intptr_t是 unsigned long int类型的, log_level表示的是日志等级,比如警告,错误等等
ngx_open_file_t的定义是
struct ngx_open_file_s{ ngx_fd_t fd;//文件描述符 ngx_str_t name;//文件名称 void (*flush)(ngx_open_file_t *file,ngx_log_t*log);//文件操作函数指针 void *data;//要写入的文件的数据缓冲区 }
这里面包含四个数据,fd自然就是文件描述符了,name也就是在文件系统中的文件名称,flush则就是函数指针,是不是写入日志的函数指针?data就是要写入的数据?
这里面的ngx_fd_t的定义就是 int类型的,也就是文件描述符
ngx_str_t的定义是
struct ngx_str_t{ size_t len;//数据长度 u_char*data; //数据缓冲区 }里面包含了,字符串的内容(data)和长度(len),这样ngx_open_file_s的数据类型就解释完了,接下来继续解释ngx_log_s,
ngx_atomic_uint_t的定义是 typedef AO_t ngx_atomic_uint_t,但是笔者并不清楚AO_t的含义是什么..
现在说下ngx_log_handler_pt函数指针的定义
typedef u_char*(*ngx_log_handler_pt)(ngx_log_t*log,u_char*buf,size_t len);向ngx_log_t结构体中记录的文件描述符,写入数据buf,还有就是数据的长度。
接下来说下ngx_cycle_t的数据类型
struct ngx_cycle_s{ void****conf_ctx; ngx_pool_t *pool; ngx_log_t *log; ngx_log_t new_log; ngx_uint_t log_user_stderr; ngx_connection_t ** file; ngx_connection_t *free_connections ngx_uint_t frss_connection_n; ngx_queue_t reusable_connections_queue; ngx_array_t listening; ngx_array_t paths; ngx_list_t open_files; ngx_list_t shared_memory; ngx_uint_t connection_n; ngx_uint_t files_n; ngx_connection_t *connections; ngx_event_t *read_events; ngx_event_t *write_events; ngx_cycle_t *old_cycle; ngx_str_t conf_file; ngx_str_t conf_param; ngx_str_t conf_prefix; ngx_str_t prefix; ngx_str_t lock_file; ngx_str_t hostname; }这个结构体好复杂的说,不过,功夫不怕有心人不是,然后咱们慢慢一个一个的看看
首先看看ngx_pool_s也就是ngx_pool_t的定义
struct ngx_pool_s{ ngx_pool_data_t d; size_t max; ngx_pool_t *current; ngx_chain_t *chain; ngx_pool_large_t *large; ngx_pool_cleanup_t *cleanup; ngx_log_t *log; }
ngx_pool_data_t的定义是:
struct ngx_pool_data_t{ u_char*last;//这里应该用的是一个内存池,last指的是内存池中该数据的起始地址 u_char* end;//end指的是该pool中数据的结束位置 ngx_pool_t* next;//下一个内存池的指针 ngx_uint_t failed;//是否可使用的标志? };ngx_chain_t的定义是 ngx_chain_s
struct ngx_chain_s{ ngx_buf_t* buf;//指向当前的buf缓冲区,如果是最后一个next是NULL ngx_chain_t*next; };
ngx_buf_t的定义是
struct ngx_buf_t{ u_char* pos;//处理内存告诉使用者,本次处理应该从pos位置开始处理数据 u_char *last;//处理内存表示该buf的 有效数据到last为止 off_t file_pos;//处理文件时应该从该位置开始 off_t file_last;//处理文件时应该到此结束 u_char *start;//buf的起始位置, u_char *end;//buf的结束位置 ngx_buf_tag_t tag;//表示当前缓冲区的类型,那个模块使用,tag指向该模块的ngx_module_t变量地址 ngx_file_t *file;//引用的文件 ngx_buf_t*shadow;//该缓冲区的影子缓冲区,也就是多个ngx_buf_t可能指向的是同一块内存,shadow指向的是多个指针,不怎么使用 unsigned temporary:1;//为1时temporary表示是整形变量,后面的1表示只占据1位,数据在内存中可以修改 unsigned memory:1;//为1时表示数据不可修改 unsigned mmap:1;//为1时表示内存使用mmap系统调用映射过来的,不可修改 unsigned recycled:1;//为1时表示,可以回收 unsigned in_file:1;//为1时标书这段缓冲区处理的是文件而不是内存 unsigned flush:1;//为1时表示需要进行flush操作 unsigned sync:1;//为1表示是否使用同步方式,谨慎使用 unsigned last_buf:1//是否是最后一块缓冲区,因为ngx_buf_t可以用ngx_chain_t串联起来 unsigned last_in_chain:1;//是否是ngx_chain_t中的最后一块 unsigned last_shadow:1; unsigned temp_fule:1//是否是临时文件 int num; }
ngx_buf_t里面好多变量,但是现在还不知道具体是做什么的,于是乎,我们只能,开始进行下一部分了,继续探索。
ngx_pool_large_t的定义是
struct ngx_pool_large_t{ ngx_pool_large_t *next; void* alloc;//这里面是重新开辟的空间?? }ngx_pool_cleanup_t的定义是
struct ngx_pool_cleanup_t{ ngx_pool_cleanup_pt handler; void *data;//这里也是数据,除了有一个函数指针跟ngx_pool_large_t一样 ngx_pool_clean_cleanup_t *next; }
ngx_pool_cleanup_pt的定义是
typedef void(*ngx_pool_cleanup_pt)(void*data);是不是handler的参数就是结构体里面的data?很有可能
相关文章推荐
- nginx之main函数的解读(三)
- nginx之main函数的解读(七)
- nginx之main函数的解读(五)
- nginx之main函数的解读(六)
- nginx之main函数的解读(八)
- nginx之main函数的解读(四)
- Nginx篇--解读nginx配置
- nginx概念解读
- nginx源码解读之一--开局
- FastDFS的配置、部署与API使用解读(7)Nginx的FastDFS模块
- nginx源码解析一(main函数分析)
- 基于 Nginx 的软件负载均衡实现解读
- nginx gzip配置参数解读
- nginx第一章--执行main函数前的描述
- Nginx-解读内置非默认模块 ngx_http_stub_status_module
- 解读nginx之虚拟主机
- nginx中CPU亲和性源码解读
- nginx配置文件nginx.conf解读
- NGINX----源码阅读一(main函数)
- Nginx 负载均衡原理解读