nginx work 进程初始化
函数ngx_worker_process_cycle()
static void
ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data)
{
… …
ngx_worker_process_init(cycle, worker);
… …
for ( ;; ) {
… …
ngx_process_events_and_timers(cycle);
… …
}
}
函数ngx_worker_process_init()
static void
ngx_worker_process_init(ngx_cycle_t *cycle, ngx_int_t worker){
… …
if (ngx_add_channel_event(cycle, ngx_channel, NGX_READ_EVENT,
ngx_channel_handler)
== NGX_ERROR)
{
/* fatal */
exit(2);
}
}
函数ngx_add_channel_event()
ngx_int_t
ngx_add_channel_event(ngx_cycle_t *cycle, ngx_fd_t fd, ngx_int_t event,
ngx_event_handler_pt handler){
… …
ev = (event == NGX_READ_EVENT) ? rev : wev;
ev->handler = handler;
if (ngx_add_conn && (ngx_event_flags & NGX_USE_EPOLL_EVENT) == 0) {
if (ngx_add_conn(c) == NGX_ERROR) {
ngx_free_connection(c);
return NGX_ERROR;
}
} else {
if (ngx_add_event(ev, event, 0) == NGX_ERROR) {
ngx_free_connection(c);
return NGX_ERROR;
}
}
}
函数ngx_channel_handler()
static void
ngx_channel_handler(ngx_event_t *ev)
{
ngx_int_t n;
ngx_channel_t ch;
ngx_connection_t *c;
if (ev->timedout) {
ev->timedout = 0;
return;
}
c = ev->data;
ngx_log_debug0(NGX_LOG_DEBUG_CORE, ev->log, 0, "channel handler");
for ( ;; ) {
n = ngx_read_channel(c->fd, &ch, sizeof(ngx_channel_t), ev->log);
ngx_log_debug1(NGX_LOG_DEBUG_CORE, ev->log, 0, "channel: %i", n);
}
}
其中函数ngx_read_channel()从socket s读取网络数据
ngx_int_t
ngx_read_channel(ngx_socket_t s, ngx_channel_t *ch, size_t size, ngx_log_t *log)
{
n = recvmsg(s, &msg, 0);
… …
}
注释:
rev->handler = ngx_channel_handler;