在worker进程的进程信息数组中,把当前worker进程信息结构(即ngx_process_slot对应的位置)中的channel[0]关掉,
同时会把其他进程的channel[1]关掉,而只把他们的channel[0]留着,如下代码所示。那么这样做的意图是什么?
ngx_worker_process_init(ngx_cycle_t *cycle, ngx_uint_t priority) {
...
for (n = 0; n < ngx_last_process; n++) {
if (ngx_processes[n].pid == -1) {
continue;
}
if (n == ngx_process_slot) {
continue;
}
if (ngx_processes[n].channel[1] == -1) {
continue;
}
if (close(ngx_processes[n].channel[1]) == -1) {
...
}
}
if (close(ngx_processes[ngx_process_slot].channel[0]) == -1) {
...
}
}
在ngx_worker_process_init的最后,调用了函数ngx_add_channel_event:
ngx_add_channel_event(cycle, ngx_channel, NGX_READ_EVENT, ngx_channel_handler)
主要的目的是向epoll中注册读事件。读数据的fd为变量ngx_channel,处理函数是ngx_channel_handler,那么ngx_channel是什么, 这个处理函数又做了些什么呢?