在mater进程首先通过调用ngx_start_worker_processes(cycle, ccf->worker_processes,NGX_PROCESS_RESPAWN);函数启动worker进程。
其中ccf->worker_processes代表启动的worker进程个数
1.变量声明。
ngx_int_t i;
ngx_channel_t ch;
2.打印一条启动worker进程的日志。
ngx_log_error(NGX_LOG_NOTICE, cycle->log, 0, "start worker processes");
3.循环调用ngx_spawn_process函数启动worker进程。并初始化ngx_channel_t ch;
ngx_pass_open_channel,不知道干啥的,一会儿看下。
1 for (i = 0; i < n; i++) { 2 3 ngx_spawn_process(cycle, ngx_worker_process_cycle, 4 (void *) (intptr_t) i, "worker process", type); 5 6 ch.pid = ngx_processes[ngx_process_slot].pid; 7 ch.slot = ngx_process_slot; 8 ch.fd = ngx_processes[ngx_process_slot].channel[0]; 9 10 ngx_pass_open_channel(cycle, &ch); 11 }
ngx_spawn_process(cycle, ngx_worker_process_cycle,(void *) (intptr_t) i, "worker process", type);
1.变量初始化
u_long on;
ngx_pid_t pid;
ngx_int_t s;
2.首先找到ngx_processes列表中是否有已经关掉的进程pid=-1,有的话则继续利用。
3.如果当前启动的进程数大于最大进程数则报错,退出。
4.初始化子父进程通信的消息队列
1 //NGX_PROCESS_DETACHED暂时不知道做什么的 2 if (respawn != NGX_PROCESS_DETACHED) { 3 4 /* Solaris 9 still has no AF_LOCAL */ 5 //打开全双工队列,用于子进程和父进程的通信。 6 if (socketpair(AF_UNIX, SOCK_STREAM, 0, ngx_processes[s].channel) == -1) 7 { 8 ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno, 9 "socketpair() failed while spawning \"%s\""<