NGINX----源码阅读---ngx_start_worker_processes(worker进程启动方法)

在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\""<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值