前言
上篇是在看ngx_worker_process_cycle()中的一个插曲,这篇继续,现在还不可能做到全知全解,只能随着源码的深入慢慢地了解。
worker进程循环工作
Nginx采用信号的IPC方式对worker进程进行控制,其中的ngx_terminate、ngx_quit、ngx_repon都将由在ngx_signal_handler方法根据收到的信号进行处理。而信号的初始化都是在main()中的ngx_init_signals()中完成的。
下面看源码吧:
static void
ngx_worker_process_cycle(ngx_cycle_t *cycle, void *data)
{
ngx_int_t worker = (intptr_t) data;
ngx_uint_t i;
ngx_connection_t *c;
/* 从master进程继承过来的全局变量,设置其为worker进程 */
ngx_process = NGX_PROCESS_WORKER;
/* Worker进程初始化,下面详述 */
ngx_worker_process_init(cycle, worker);
/* 更改进程名字,这个很有意思...详见《笔记十五》 */
ngx_setproctitle("worker process");
/* 针对worker子进程中的线程机制的,一般用不到,这里通过设置NGX_THREADS宏来开启 */
#if (NGX_THREADS)
{
ngx_int_t n;
ngx_err_t err;
ngx_core_conf_t *ccf;
ccf = (ngx_core_conf_t *) ngx_get_conf(cycle->conf_ctx, ngx_core_module);
if (ngx_threads_n) {
if (ngx_init_threads(ngx_threads_n, ccf->thread_stack_size, cycle)
== NGX_ERROR)
{
/* fatal */
exit(2);
}
err = ngx_thread_key_create(&ngx_core_tls_key);
if (err != 0) {
ngx_log_error(NGX_LOG_ALERT, cycle->log, err,
ngx_thread_key_create_n " failed");
/* fatal */
exit(2);
}
for (n = 0; n < ngx_threads_n; n++) {
ngx_threads[n].cv = ngx_cond_init(cycle->log);
if (ngx_threads[n].cv == NULL) {
/* fatal */
exit(2);
}
if (ngx_create_thread((ngx_tid_t *) &ngx_threads[n].tid,
ngx_worker_thread_cycle,
(void *) &ngx_threads[n], cycle->log)
!= 0)
{
/* fatal */
exit(2);
}
}
}
}
#endif
/* 这里Nginx是通过采用信号的方式,控制worker进程运行,具体的处理信号的方法
* 其实在main()函数中的ngx_init_signals()初始化工作中已经弄好,可以见signals[]数组中的
* ngx_signal_handler()处理函数,之后打算好好看看ngx_init_signals()这个函数
*/
for ( ;