- 博客(27)
- 收藏
- 关注
原创 gdb 高级用法
<br />1 条件断点 <br /> <br />19 #include <stdio.h> 20 21 int main() 22 { 23 int i,j; 24 for( i = 0; i < 10; ++i) 25 {
2010-11-26 20:05:00 1538 1
原创 nginx signal 之 quit reload
<br /> 这个信号,使master进程的环境重新加载,同时启动一批新的子进程,再把原来的进程退出,这样可以是系统平稳的重启。 <br /> <br /> 在收到这个信号好,系统:<br /> //收到 reload 信号 if (ngx_reconfigure) { ngx_reconfigure = 0; //更新程序了 if (ngx_new_binary) {
2010-11-23 20:26:00 1243 1
原创 nginx signal 之 quit
quit信号其实和前面介绍的stop基本一样,唯一的不同之处就是quit是一种优雅的停止,也就是进程如果还在服务中,那么就不会关闭该进程,直到进程完成服务为止。当然这个过程中不能再接受新的任务了。
2010-11-21 22:08:00 2722 1
原创 nginx signal 之 stop
<br /> 当运行的nginx程序收到了 stop信号后是如何处理,使整个程序停下来的呢? 总结了下,主要有下面几个步骤:<br /> <br /> 一 master进程收到 stop 信号后,把 ngx_terminate 设置为1 <br /> <br /> 二 master看到ngx_terminate 为1 ,通过channel向子进程发送 NGX_CMD_TERMINATE 命令<br /> <br /> 三 子进程收到命令后,把 ngx_termi
2010-11-21 18:19:00 2950 4
原创 nginx 父子进程通信 channel
<br /> nginx 中利用socketpair()函数,创建一对相互连接的socket,实现父子进程的通信。 下面分析下整个过程: <br /> <br />一 创建 <br /> 在子进程创建之前,需要创建这样一对连接: ngx_spawn_process函数(ngx_process.c中)<br /> //创建一对匿名的已经连接的套接字 if (socketpair(AF_UNIX, SOCK_STREAM, 0, ngx_proces
2010-11-20 21:06:00 5111 7
原创 nginx add listen sock to epoll
到进程获得了监听锁的时候,就会调用ngx_enable_accept_events函数,我们来看看这个函数作什么事情:ngx_enable_accept_events(ngx_cycle_t *cycle){ ngx_uint_t i; ngx_listening_t *ls; ngx_connection_t *c; ls = cycle->listening.elts; for (i = 0; i listening
2010-11-19 20:01:00 1964 1
原创 nginx signal
objs/nginx -h -s signal : send signal to a master process: stop, quit, reopen, reload nginx 支持 stop ,quit , reopen ,reload 四种信号 一 信号定义 typedef struct { int signo; //信号的编号 char *signame; //信号的名字
2010-11-19 18:49:00 6961 1
原创 nginx phases 详细介绍
我们知道,nginx 请求分为下面几个阶段:typedef enum { NGX_HTTP_POST_READ_PHASE = 0, //读取请求 NGX_HTTP_SERVER_REWRITE_PHASE, //server重写 NGX_HTTP_FIND_CONFIG_PHASE, //查找配置 NGX_HTTP_REWRITE_PHASE, //重写 NGX_HTTP_POST_REWRI
2010-11-18 17:11:00 1829 2
原创 nginx location tree
<br /> nginx通过三叉查找树来定位处理函数,当我们把位置放到队列后,整个结果如下图: <br /> <br /><br /> <br />在ngx_http_core_loc_conf中的location位置,这里使用红色表示的,比如 a, b ,c ,aa, bb, cc ,而在每个location中,又有inclusive和exact指向ngx_http_core_loc_conf ,表示该位置的子位置。 <br /> <br /> 在 ngx_http_init_stat
2010-11-18 16:13:00 1917
原创 nginx phases
nginx 在处理请求的过程中,需要经过一些阶段,具体阶段可以在ngx_http_core_module.h中定义: typedef enum { NGX_HTTP_POST_READ_PHASE = 0, //读取请求 NGX_HTTP_SERVER_REWRITE_PHASE, //server重写 NGX_HTTP_FIND_CONFIG_PHASE, //查找配置 NGX_HTTP_REWRITE_PHASE,
2010-11-17 20:25:00 1832
原创 nginx location 定位
<br /><br /> 我们前面写过hello_world模块,当我们再游览器中输入 http://10.22.222.33:80/helloworld?q=xiaochi ,最后是如何到达我们的hello_world的处理函数的呢? <br /><br /> 首先我们来看我们的配置文件<br /> http{ <br /> server{<br /> location /hello {<br /> ngx_he
2010-11-17 14:04:00 3606
原创 nginx http server location 关系
<br /> 我们在配置文件中,可以看到类似下面的结构:<br /> <br /> http{<br /> server{<br /> location a {<br /> <br /> }<br /> location b{<br /> <br /> }<br />
2010-11-17 13:10:00 10524 1
原创 nginx 处理请求
<br /> 我在上面前面介绍,nginx把connection的read事件设置为ngx_http_init_request,那么请求过来的时候,系统就调用这个函数开始了请求过程,接下来对这个函数进行介绍:<br /> <br />
2010-11-16 16:19:00 1019
原创 nginx 处理accept
<br /> accept过程实现在 ngx_event_accept.c中的ngx_event_accept函数中,主要过程如下:<br /> <br /> 一 accept()<br /> <br /> 二 从连接池中取得一个连接 <br /> c = ngx_
2010-11-16 11:51:00 2901
原创 nginx listen
<br /> nginx中使用ngx_listening 来监听外部的连接请求<br /> struct ngx_listening_s { ngx_socket_t fd; //socket struct sockaddr *sockaddr; //地址 socklen_t socklen; /* size of sockaddr */ size_t ad
2010-11-16 11:06:00 3554
原创 nginx 进程的类型
nginx 有使用ngx_process 变量表示进程的类型,这个变量的取值在ngx_process_cycle.h中定义,主要有下面几个#define NGX_PROCESS_SINGLE 0 //单独进程#define NGX_PROCESS_MASTER 1 //主进程#define NGX_PROCESS_SIGNALLER 2 //信号进程#define NGX_PROCES
2010-11-14 17:53:00 3314
原创 nginx module
nginx 支持模块化,系统中的很多功能就是一个模块,比如event、http、email 等,可以看出,模块在nginx中重要性,模块的定义在 src/core/ngx_conf_file.h中, struct ngx_module_s { ngx_uint_t ctx_index; //分类索引,在该类别下模块中的索引号,现在系统core、event、http和mail四种模块 ngx_uint_t
2010-11-14 16:12:00 1336
原创 nginx conf
<br /> 从配置文件和系统的参数之间,ngx_conf_s 在起着一个桥梁的作用,我们再这里暂时把它定名了指令结构吧<br /> <br />struct ngx_conf_s { char *name; //这个好像没有用,下面args中第一个就是名字 ngx_array_t *args; //指令参
2010-11-13 22:06:00 1359
原创 nginx cycle
在系统整个运行过程中,需要使用的一些参数、资源需要统一的管理,nginx把这个任务交给了ngx_cycle_t struct ngx_cycle_s { void ****conf_ctx; //指向模块的配置 ngx_pool_t *pool; //内存池 ngx_log_t *log;
2010-11-13 19:38:00 2527
原创 fork 父子进程变量之间的关系
<br /> 调用fork,会有两次返回,一次是父进程、一次是子进程,因为子进程是父进程的副本,所以它拥有父进程数据空间、栈和堆的副本,它们并没有共享这些存储空间,它们只共享正文段。 我们通过下面的程序验证下。 19 #include<unistd.h> 20 #include<stdio.h> 21 22 int global = 6; 23 24 int main(int argc,char** argv) 25 { 26 int var=10;
2010-11-12 19:55:00 4776 2
原创 nginx 配置文件解析
<br /> ngx_conf_parse 这个函数来完成对配置文件的解析,其实这个函数不仅仅解析文件,还可以用来解析参数和块的,不过我们在这里分析解析文件。 <br /> <br /> 文件简单的分为三个部分<br /> 一 配置文件预先处理<br /> 二 读取<br /> 三 处理 <br /> <br /> <br /> 一 配置文件预处理<br /> 主要打开文件,创建缓冲区,并把文件信息以及读取的缓冲区信息填到cf->conf_file
2010-11-12 17:03:00 2123 1
原创 nginx 整体结构
零零碎碎的看了nginx的源码,自己感觉还是比较的乱,所以花点时间把它的整体结构给理下, 一 模块的结构(ngx_module_t) index 是指模块的下标,系统在初始化的是,给了每个模块一个唯一id,就好比每个学生都有一个学号,每个员工都有一个工号,下标从0开始。 ctx 是模块的上下文,不同的模块具有不同的上下文,这个具体在第二部分介绍 command 处理指令,在配置文件中的每条指令,在模块中都有对应的处理,因为每个模块可以有多个指令
2010-11-11 23:06:00 2133 1
原创 nginx connections 介绍
connection 主要负责连接,里面存放了很多的信息: 读事件、写事件、socket等。 一 创建 在nginx_event.c 中的ngx_event_process_init 函数中创建: //给connect 分配空间 cycle->connections = ngx_alloc(sizeof(ngx_connection_t) * cycle->connection_n, cycle->log); //给connect分配内存 if
2010-11-11 13:42:00 2640
原创 nginx accept 加锁
nginx 采用多进程的模,当一个请求过来的时候,系统会对进程进行加锁操作,保证只有一个进程来接受请求。 加锁: ngx_trylock_accept_mutex(cycle) 解锁: ngx_shmtx_unlock(&ngx_accept_mutex) 下面对加锁和解锁进行详细的介绍: 一 加锁操作 ngx_int_t271 ngx_trylock_accept_mutex(ngx_cycle_t *cycle)272 {273
2010-11-10 18:35:00 3904
原创 hadoop 运行 wordcount
<br />1 源代码<br />package com.felix;import java.io.IOException;import java.util.Iterator;import java.util.StringTokenizer;import org.apache.hadoop.fs.Path;import org.apache.hadoop.io.IntWritable;import org.apache.hadoop.io.LongWritable;import
2010-11-09 11:25:00 2848
原创 linux 文件操作
1 mmap mmap将一个文件或者其它对象映射进内存。文件被映射到多个页上,如果文件的大小不是所有页的大小之和,最后一个页不被使用的空间将会清零使用#include void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset); int munmap(void *start, size_t length); 参数: start:映射区的开始地址。
2010-11-01 18:59:00 442
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人