分类: LINUX
2014-02-11 11:16:06
14 typedef struct {
15 int signo;
16 char *signame;
17 char *name;
18 void (*handler)(int signo);
19 } ngx_signal_t; //关于信号的结构体
39 ngx_signal_t signals[] = {
40 { ngx_signal_value(NGX_RECONFIGURE_SIGNAL),
41 "SIG" ngx_value(NGX_RECONFIGURE_SIGNAL),
42 "reload",
43 ngx_signal_handler },
44
45 { ngx_signal_value(NGX_REOPEN_SIGNAL),
46 "SIG" ngx_value(NGX_REOPEN_SIGNAL),
47 "reopen",
48 ngx_signal_handler },
.......
82 { 0, NULL, "", NULL }
83 }; //创建结构体数组,存放各种信号的操作集合
针对ngx_signal_value的分析
52 #if !(NGX_WIN32)
53
54 #define ngx_signal_helper(n) SIG##n
55 #define ngx_signal_value(n) ngx_signal_helper(n)
56
57 #define ngx_random random
58
59 /* TODO: #ifndef */
60 #define NGX_SHUTDOWN_SIGNAL QUIT
61 #define NGX_TERMINATE_SIGNAL TERM
62 #define NGX_NOACCEPT_SIGNAL WINCH
63 #define NGX_RECONFIGURE_SIGNAL HUP
SIG##n相当于SIGn
针对ngx_value分析
227 #define ngx_value_helper(n) #n
228 #define ngx_value(n) ngx_value_helper(n)
229
#n 相当于 “n”
当状态处于NGX_PROCESS_SINGLE时,继续用switch语句结构,对signo信号进行匹配,匹配成功置值,例如ngx_quit = 1;
在《深入剖析nginx》一书中,有讲到。假如有一个主进程和一个次进程。
主进程是监控进程,函数是ngx_master_process_cycle(),初始化阶段会对相关信号集调用sigprocmask,进行信号阻塞,在一个死循环内,调用sigsuspend(解除阻塞,并进行相应的信号处理),然后是针对信号标量的值,调用相应的函数处理。
注册的信号处理函数是ngx_signal_handler,主要是针对信号的相应标量进行设置。根本的处理还是由ngx_master_process_cycle主流程的死循环中进行信号处理。