到进程获得了监听锁的时候,就会调用ngx_enable_accept_events函数,我们来看看这个函数作什么事情:
ngx_enable_accept_events(ngx_cycle_t *cycle) { ngx_uint_t i; ngx_listening_t *ls; ngx_connection_t *c; ls = cycle->listening.elts; for (i = 0; i < cycle->listening.nelts; i++) { c = ls[i].connection; //如果使用real time signal模型 if (ngx_event_flags & NGX_USE_RTSIG_EVENT) { if (ngx_add_conn(c) == NGX_ERROR) { return NGX_ERROR; } } else { //在linux 下,调用下面的函数 if (ngx_add_event(c->read, NGX_READ_EVENT, 0) == NGX_ERROR) { //ngx_epoll_add_event : src/event/modules/ngx_epoll_module.c:344 return NGX_ERROR; } } } return NGX_OK; }
主要是遍历listen,调用ngx_add_event函数,这个函数定义
#define ngx_add_event ngx_event_actions.add
我们在看看这个ngx_event_actions从哪里来的,在ngx_epoll_init函数中,我们看到
ngx_event_actions = ngx_epoll_module_ctx.actions;
那么看下 ngx_epoll_module_ctx :
//epoll 模块的上下文 ngx_event_module_t ngx_epoll_module_ctx = { &epoll_name, ngx_epoll_create_conf, /* create configuration */ ngx_epoll_init_conf, /* init configuration */ //action函数 { ngx_epoll_add_event, /* add an event */ ngx_epoll_del_event, /* delete an event */ ngx_epoll_add_event, /* enable an event */ ngx_epoll_del_event, /* disable an event */ ngx_epoll_add_connection, /* add an connection */ ngx_epoll_del_connection, /* delete an connection */ NULL, /* process the changes */ ngx_epoll_process_events, /* process the events */ ngx_epoll_init, /* init the events */ ngx_epoll_done, /* done the events */ } };
所以,ngx_add_event 实际就是调用了 ngx_epoll_add_event 函数,把socket添加到epoll中。