Chinaunix首页 | 论坛 | 博客
  • 博客访问: 44525
  • 博文数量: 17
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 106
  • 用 户 组: 普通用户
  • 注册时间: 2014-02-11 11:04
文章分类

全部博文(17)

文章存档

2014年(17)

我的朋友

分类: LINUX

2014-02-11 11:16:06

一.nginx中关于单个信号的结构体

 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”

二.main函数中ngx_init_signals对信号捕捉的初始化处理


283 ngx_int_t
284 ngx_init_signals(ngx_log_t *log)
285 {
286     ngx_signal_t      *sig;
287     struct sigaction   sa;
288 
289     for (sig = signals; sig->signo != 0; sig++) {
290         ngx_memzero(&sa, sizeof(struct sigaction));
291         sa.sa_handler = sig->handler;
292         sigemptyset(&sa.sa_mask);
293         if (sigaction(sig->signo, &sa, NULL) == -1) {
294             ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,
295                           "sigaction(%s) failed", sig->signame);
296             return NGX_ERROR;
297         }
298     }
299 
300     return NGX_OK;
301 }
302 

  三. 关键处理函数ngx_signal_handler(signo)

ngx_process在ngx_process_cycle.c文件中,是一个全局变量,还有其他信号的全局状态变量,比如有sig_atomic_t  ngx_quit,对个程序流对数据处理,用sig_atomic_t。
用switch语句,首先进行处理状态的判断


 23 #define NGX_PROCESS_SINGLE     0
 24 #define NGX_PROCESS_MASTER     1
 25 #define NGX_PROCESS_SIGNALLER  2
 26 #define NGX_PROCESS_WORKER     3
 27 #define NGX_PROCESS_HELPER     4

当状态处于NGX_PROCESS_SINGLE时,继续用switch语句结构,对signo信号进行匹配,匹配成功置值,例如ngx_quit = 1;


326     switch (ngx_process) {
327 
328     case NGX_PROCESS_MASTER:
329     case NGX_PROCESS_SINGLE:
330         switch (signo) {
331 
332         case ngx_signal_value(NGX_SHUTDOWN_SIGNAL):
333             ngx_quit = 1;
334             action = ", shutting down";
335             break;


 四.nginx中进程与信号

 在《深入剖析nginx》一书中,有讲到。假如有一个主进程和一个次进程。

主进程是监控进程,函数是ngx_master_process_cycle(),初始化阶段会对相关信号集调用sigprocmask,进行信号阻塞,在一个死循环内,调用sigsuspend(解除阻塞,并进行相应的信号处理),然后是针对信号标量的值,调用相应的函数处理。


注册的信号处理函数是ngx_signal_handler,主要是针对信号的相应标量进行设置。根本的处理还是由ngx_master_process_cycle主流程的死循环中进行信号处理。



阅读(1692) | 评论(2) | 转发(0) |
0

上一篇:没有了

下一篇:linux c嵌套宏定义的处理(特殊情况)

给主人留下些什么吧!~~

452533212014-02-12 10:23:00

啦哆A梦:不错不错

谢谢支持!

回复 | 举报

啦哆A梦2014-02-12 09:30:15

不错不错