博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

nginx 多进程 进程间通信

Posted on 2016-02-29 16:50  bw_0927  阅读(293)  评论(0)    收藏  举报

http://techlog.cn/article/list/10182649

 

子进程共有一下五种模式,即 respawn 参数有以下取值:

#define NGX_PROCESS_NORESPAWN -1        // 子进程退出时,父进程不再创建
#define NGX_PROCESS_JUST_SPAWN -2       //用于在子进程退出并重新创建后标记是刚刚创建的新进程,防止被父进程意外终止
#define NGX_PROCESS_RESPAWN -3            // 子进程退出时,父进程需要重新创建
#define NGX_PROCESS_JUST_RESPAWN -4   // 该标记用来标记进程数组中哪些是新创建的子进程
#define NGX_PROCESS_DETACHED -5          // 热代码替换

 

 

  • ngx_read_channel

当新创建的子进程通过ngx_pass_open_channel()--->ngx_write_channel()传递fd[0]时,其他接收子进程的调用堆栈如下

(gdb) bt
#0 ngx_read_channel (s=11, ch=0x7fffffffe050, size=32, log=0x6f6798) at src/os/unix/ngx_channel.c:112
#1 0x0000000000437fc5 in ngx_channel_handler (ev=0x716dc8) at src/os/unix/ngx_process_cycle.c:1112
#2 0x00000000004393da in ngx_epoll_process_events (cycle=0x6f6780, timer=500, flags=1)
at src/event/modules/ngx_epoll_module.c:685
#3 0x0000000000429b84 in ngx_process_events_and_timers (cycle=0x6f6780) at src/event/ngx_event.c:248
#4 0x00000000004372d9 in ngx_worker_process_cycle (cycle=0x6f6780, data=0x0) at src/os/unix/ngx_process_cycle.c:822
#5 0x0000000000433ae6 in ngx_spawn_process (cycle=0x6f6780, proc=0x4370f0 <ngx_worker_process_cycle>, data=0x0,
name=0x4b89cb "worker process", respawn=-3) at src/os/unix/ngx_process.c:198
#6 0x0000000000436083 in ngx_start_worker_processes (cycle=0x6f6780, n=3, type=-3) at src/os/unix/ngx_process_cycle.c:368
#7 0x00000000004356c1 in ngx_master_process_cycle (cycle=0x6f6780) at src/os/unix/ngx_process_cycle.c:140
#8 0x0000000000403573 in main (argc=1, argv=0x7fffffffe6b8) at src/core/nginx.c:407

 

  • ngx_write_channel     由主进程master负责把新创建的子进程的fd信息传递给其他先创建的子进程

(gdb) bt
#0 ngx_write_channel (s=7, ch=0x7fffffffe250, size=32, log=0x6f6798) at src/os/unix/ngx_channel.c:29
#1 0x0000000000436423 in ngx_pass_open_channel (cycle=0x6f6780, ch=0x7fffffffe250) at src/os/unix/ngx_process_cycle.c:458
#2 0x00000000004360db in ngx_start_worker_processes (cycle=0x6f6780, n=3, type=-3) at src/os/unix/ngx_process_cycle.c:375
#3 0x00000000004356c1 in ngx_master_process_cycle (cycle=0x6f6780) at src/os/unix/ngx_process_cycle.c:140
#4 0x0000000000403573 in main (argc=1, argv=0x7fffffffe6b8) at src/core/nginx.c:407

主进程创建完子进程,传递完子进程信息后,

ngx_start_cache_manager_processes()

最后sigsuspend()  等待信号处理

此时,在终端kill -9 pid_of_one_worker,将会唤醒master进程,sigsuspend()返回

主进程将会向其他子进程通知刚刚挂掉的进程信息,改写ngx_processes[]信息

然后重新创建一个子进程,并再次更新ngx_processes[]信息