假设现在ngx_init_cycle已经结束(毕竟这个函数确实庞大),也就是说关于nginx的初始化都已经结束。那么看看如何创建进程模型ngx_master_process_cycle。
在这个函数中,首先情况一些信号,然后将需要关注的信号注册进去(这个时候关于信号的处理函数已经被注册),可以看出来master进程关注的信号有10个。比如SIGCHLD等。接下来调用ngx_start_worker_processes函数,这个函数就是开启worker进程的函数,剩下的master进程就进入一个死循环,这个死循环就是等待这个外部信号的激活,如果有一个信号,那么就更新一次时间,master进程大部分时间都阻塞在sigsuspend函数上。接受到不同的信号进行不同的处理,有的信号需要传递给worker进程。
看ngx_start_worker_processes函数,这个函数中有一个for循环,一次循环创建一个worker进程,都是打开父子进程之间的socketpair,, ngx_pass_open_channel函数将自己的信息传递给别的所有进程。
ngx_spawn_process函数中创建socketpair,然后fork,子进程调用ngx_worker_process_cycle,。
ngx_worker_process_cycle这个函数也非常的重要,在ngx_worker_process_init函数中屏蔽了从父进程继承的所有信号处理函数,同时关闭从父进程继承的socketpair套接字,这对socketpair,其中0为了写,1为了读,所以同时需要关闭自己的写,只需要打开自己读即可,同时在读的套接字上注册ngx_channle_handler函数,这个函数是为了修改全局变量的,为了worker进程接受父进程传递的信号而存在的。Ngx_add_channel_event将自己的1添加到监听队列中。接下来worker进程就进入了死循环,要么处理事件,要么处理信号。
ngx_process_events_and_timers这个函数就是处理业务的。
接下来解析业务的整流程!