函数关系
ngx_master_process_cycle
ngx_setproctitle
ngx_start_worker_processes
for(i=0;i<threadnums;i++) //循环多次创建子进程
ngx_spawn_process(i,"worker process");
pid=fork();
//执行的进程分支判断。对于父进程分支,直接返回;对于子进程分支,继续往下看
ngx_worker_process_cycle //子进程才会执行该分支
ngx_worker_process_init
sigprocmask(SIG_SETMASK, &set, NULL) //取消信号屏蔽
g_threadpool.Create(tmpthreadnums); //创建线程池中线程
g_socket.Initialize_subproc(); //子进程一些初始化
g_socket.ngx_epoll_init(); //执行CSocket::ngx_epoll_init
epoll_create(……);
ngx_epoll_add_event(……);
epoll_ctl(……);
ngx_setproctitle //专门为子进程设置标题
for(;;)
//worker进程就在这个无限的for循环中循环着
ngx_process_events_and_timers(); //处理网络事件等
g_socket.ngx_epoll_process_events(-1);
epoll_wait(……);
g_threadpool.StopAll(); //停止线程池
g_socket.Shutdown_subproc(); //socket释放需要释放的资源
//以下的执行分支只有在master进程中会执行到
sigemptyset(&set);
for( ;; )
master进程就在这个无限的for循环中循环着