1. 程式人生 > >Nginx事件處理中的connection和read、write事件的關聯

Nginx事件處理中的connection和read、write事件的關聯

ase handle inux cycle ngx auth eof conn ont

/*********************************************************************
 * Author  : Samson
 * Date    : 07/08/2015
 * Test platform:
 *              gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2
 *              GNU bash, 4.3.11(1)-release (x86_64-pc-linux-gnu) 
 * Nginx version:
 *              Nginx 1.6.2
 *              Nginx 1.8.0
 * *******************************************************************/

Nginx事件處理中的connection和read、write事件的關聯:


在Nginx代碼中常常看到rev = c->read。ngx_handle_read_event(rev, 0);這種操作。那麽rev是什麽呢?

在ngx_epoll_add_event中的ngx_connection_t *c = ev->data;中的ev->data又是什麽內容呢?


事實上這一切都在ngx_event_process_init找到蹤跡。在此函數中進行了cycle全局結構的read_events、write_events、connections的空間的生成及這三者間的關聯關系。

這3個結構的生成的代碼:

cycle->connections = ngx_alloc(sizeof(ngx_connection_t) * cycle->connection_n, cycle->log);


cycle->read_events = ngx_alloc(sizeof(ngx_event_t) * cycle->connection_n, cycle->log);


cycle->write_events = ngx_alloc(sizeof(ngx_event_t) * cycle->connection_n, cycle->log);


//read_events、write_events、connections的關聯,這三者在cycle中的下標相等的表示是一個連接的事件和連接相應的fd等信息。這些信息在後期的時候會直接用到

c = cycle->connections;

i = cycle->connection_n;

next = NULL;


do {

i--;


c[i].data = next;

c[i].read = &cycle->read_events[i];

c[i].write = &cycle->write_events[i];

c[i].fd = (ngx_socket_t) -1;


next = &c[i];


#if (NGX_THREADS)

c[i].lock = 0;

#endif

} while (i);


Nginx事件處理中的connection和read、write事件的關聯