11 2012 档案
摘要:1. 函数指针定义函数类型 (*指针变量名)(行参列表);"函数类型"说明时函数的返回类型,由于“()”的优先级高于“*”,所以指针变量名外的括号必不可少,后面的“形参列表”表示指针变量指向的函数所带的参数列表。例如: int (*f)(int x); double (*ptr)(double x);在定义函数指针的时候注意:函数指针和它指向的函数的参数个数和类型都应该是一致的。函数指针的类型和函数的返回值的类型也必须是一致的。2.函数指针的赋值:函数名和数组名一样代表了函数代码的首地址,因此在赋值时,直接将函数指针指向函数名即可.例如 :int func(int x);
阅读全文
摘要:对于web server来说,必须能够监听到客户端的连接才能与之通信,这篇文章就看一下nginx是如何实现连接的建立。监听到新的连接实际上就是监听socket上的读事件,此时监听socket的已完成连接队列是非空的,可以非阻塞的调用accpet获取新到的连接。在nginx中每个socket都会被封装成一个连接结构,就是ngx_connection_t类型。每个ngx_connection_t结构具有读写事件read和write,它们是ngx_event_t类型的,有一个handler回调函数指针,在发生读写事件时被调用。在ngx_event_process_init函数中为每个监听sock..
阅读全文
摘要:1. 一些相关的数据结构:// 监听端口配置信息,addrs是在该端口上所有监听地址的数组。typedef struct { ngx_int_t family; in_port_t port; ngx_array_t addrs; /* array of ngx_http_conf_addr_t */} ngx_http_conf_port_t;typedef struct { ngx_http_listen_opt_t opt; ngx_hash...
阅读全文
摘要:对于一个服务器模型来说,事件模型是至关重要的,nginx本身的高性能也归功于它的事件模型。一般来说,nginx的事件模型是基于epoll。而epoll中会调用3函数,epoll_create,epoll_ctl,epoll_wait. (1) 首先介绍一些相关的数据结构:typedef struct { ngx_int_t (*add)(ngx_event_t *ev, ngx_int_t event, ngx_uint_t flags); //将某描述符的某个事件(可读/可写)添加到多路复用监控里 ngx_int_t (*del)(ngx_event_t *ev, ng...
阅读全文
摘要:nginx的模块非常之多,可以认为所有代码都是以模块的形式组织,这包括核心模块和功能模块,针对不同的应用场合,并非所有的功能模块都要被用到,附录A给出的是默认configure(即简单的http服务器应用)下被连接的模块,这里虽说是模块连接,但nginx不会像apache或lighttpd那样在编译时生成so动态库而在程序执行时再进行动态加载,nginx模块源文件会在生成nginx时就直接被编译到其二进制执行文件中,所以如果要选用不同的功能模块,必须对nginx做重新配置和编译。对于功能模块的选择,如果要修改默认值,需要在进行configure时进行指定,比如新增http_flv功能模块...
阅读全文
摘要:首先来看一下,配置文件解析时的数据结构,这里主要是ngx_conf_t,这个结构保存了解析配置文件所需要的一些域,是一个非常重要的数据结构.struct ngx_conf_s{ char *name;//当前解析的命令名 ngx_array_t *args; //当前命令的所有参数 ngx_cycle_t *cycle; ngx_pool_t *pool; ngx_pool_t ...
阅读全文
摘要:slab的一些结构体:typedef struct { ngx_atomic_t lock; // 锁,因为slab在nginx中一般配合共享内存使用 size_t min_size; // 分配空间的最小值 size_t min_shift; // 该最小值对应的移位数 ngx_slab_page_t *pages; // 页数组 ngx_slab_page_t free; // 空闲的页 u_char *start; // 分配...
阅读全文
摘要:首先,要使用共享内存,大致为以下几步,可能不同的应用之间会小有点区别,但我们先学会使用简单的,然后我们等对nginx中的共享内存的原理了解之后,就可以轻松运用了。1. 一般我们需要几个变量来管理共享内存,一般放到全局的配置结构全中去,或直接一个全局变量。ngx_shm_zone_t指针来引用 我们创建的共享内存、ngx_slab_pool_t指针来管理我们共享内存的分配与释放。2. 在读取或初始化配置文件时,调用ngx_shared_memory_add向全局共享内存链表中添加一个共享内存,然后保存到之前创建的ngx_shm_zone_t指针。接着,注册我们自己的共享内存初始化函数。3. 在我
阅读全文
摘要:我们知道,如果我们模块需要一块共享的内存,需要调用ngx_share_memory_add来创建共享内存,而该函数不会马上创建一个共享内存,它是先登记一下共享内存的信息,例如名称,大小,然后在进程初始化时再进行共享内存的创建和初始化. ngx_shared_memory_add这个函数是将共享内存的分配登记在哪里,在ngx_cycle_s这个结构体中有一个成员,即ngx_cycle_s->shared_memory,它是个list,用来保存所有登记的共享内存,这个list中保存的ngx_shm_zone_t类型的数据, ngx_shm_zone_t的结构体:struct ngx_sh..
阅读全文
摘要:共享内存是Linux下进程之间进行数据通信的最有效方式之一,而nginx就为我们提供了统一的操作接口来使用共享内存。在nginx里,一块完整的内存以结构体ngx_shm_zone_s封装.其中包括是共享内存的名字(shm_zone[i].shm.name),大小(shm_zone[i].shm.size),标签(shm_zone[i].tag), ngx_shm_zone_init_pt init; (初始化共享内存时的回调函数)一些共享内存的结构体:struct ngx_shm_zone_s void *data; n...
阅读全文
摘要:运行在多进程模型的nginx在正常工作时,自然就会有多个进程实例,比如下图是在配置“worker_processes 4;”情况下的显示,nginx设置的进程title能很好的帮助我们区分监控进程与工作进程,不过带上选项f的ps命令以树目录的形式打印各个进程信息也能帮助我们做这个区分。多进程联合工作必定要牵扯到进程之间的通信问题,下面就来看看nginx是如何做的。 采用socketpair()函数创造一对未命名的unix域套接字来进行进程之间的双向通信.基本的数据结构: typedef struct { /** * 进程id */ ngx_pid_t ...
阅读全文
摘要:nginx的进程模型和大多数后台服务程序一样,按职责将进程分成监控进程和工作进程两类,启动nginx的主进程充当监控进程,而由主进程fork出来的子进程则充当工作进程。工作进程的任务自然是完成具体的业务逻辑,而监控进程充当整个进程组的对外接口,同时对工作进程进行监护,比如如果某工作进程意外退出,监控进程将重新fork生成一个新的工作进程。nginx也可以单进程模型执行,在这种进程模型下,主进程就是工作进程,此时没有监控进程,单进程模型比较简单且官方建议仅供测试使用,所以下面主要分析多进程模型。 nginx多进程模型的入口函数为主进程的ngx_master_process_cycle(), ..
阅读全文
摘要:一,什么是foreign key,及其完整性个人觉得,foreign key就是表与表之间的某种约定的关系,由于这种关系的存在,我们能够让表与表之间的数据,更加的完整,关连性更强。关于完整性,关连性我举个例子,大家就会明白了。有二张表,一张是用户表,一张是订单表:1,如果我删除了用户表里的用户,那么订单表里面根这个用户有关的数据,就成了无头数据了,不完整了。2,如果我在订单表里面,随便插入了一条数据,这个订单在用户表里面,没有与之对应的用户。这样数据也不完整了。如果有外键的话,就方便多了,可以不让用户删除数据,或者删除用户的话,通过外键同样删除订单表里面的数据,这样也能让数据完整。二,使用fo
阅读全文
摘要:指针是一个特殊的变量,它里面存储的数值被解释成为内存里的一个地址。要搞清一个指针需要搞清指针的四方面的内容:指针的类型,指针所指向的类型,指针的值或者叫指针所指向的内存区,还有指针本身所占据的内存区。让我们分别说明。 先声明几个指针放着做例子: 例一: (1)int*ptr; (2)char*ptr; (3)int**ptr; (4)int(*ptr)[3]; (5)int*(*ptr)[4]; 指针的类型 从语法的角度看,你只要把指针声明语句里的指针名字去掉,剩下的部分就是这个指针的类型。这是指针本身所具有的类型。让我们看看例一中各个指针的类型: (1)int*ptr;...
阅读全文