本文 主要分析master进程和worker进程之间是如何使用channel来完成通信的。这部分实现的代码主要分布在src/os/unix/ngx_channel.c文件中。master进程将数据传给worker进程,用socketpair创建的通道channel[0]将命令发送给worker进程,告诉worker进程要做什么。而worker进程不需要告诉master进程做什么,是一个单向的通道。

master进程每次发送给worker进程的指令用如下的一个结构来完成封装

typedef struct {ngx_uint_t  command;ngx_pid_t   pid;ngx_int_t   slot;ngx_fd_t    fd;
} ngx_channel_t;

四个成员分别表示命令、worker进程的pid、worker进程的slot(在ngx_processes数组中的下标)、文件描述符。

worker进程在收到这个的一个结构数据后,通过判断command来作相应的动作。

master进程用于处理SIGCHLD信号的函数ngx_reap_children中就有向worker进程发送关闭channel的指令

worker进程在调用ngx_worker_process_init函数时,通过ngx_add_channel_event将channel放到epoll事件处理模块中。

    if (ngx_add_channel_event(cycle, ngx_channel, NGX_READ_EVENT,ngx_channel_handler)== NGX_ERROR){/* fatal */exit(2);}

当收到master进程发过来的命令后,就调用ngx_channel_handler处理,ngx_channel_handler主要做什么呢

        switch (ch.command) {case NGX_CMD_QUIT:ngx_quit = 1;break;case NGX_CMD_TERMINATE:ngx_terminate = 1;break;case NGX_CMD_REOPEN:ngx_reopen = 1;break;case NGX_CMD_OPEN_CHANNEL:ngx_log_debug3(NGX_LOG_DEBUG_CORE, ev->log, 0,"get channel s:%i pid:%P fd:%d",ch.slot, ch.pid, ch.fd);ngx_processes[ch.slot].pid = ch.pid;ngx_processes[ch.slot].channel[0] = ch.fd;break;case NGX_CMD_CLOSE_CHANNEL:ngx_log_debug4(NGX_LOG_DEBUG_CORE, ev->log, 0,"close channel s:%i pid:%P our:%P fd:%d",ch.slot, ch.pid, ngx_processes[ch.slot].pid,ngx_processes[ch.slot].channel[0]);if (close(ngx_processes[ch.slot].channel[0]) == -1) {ngx_log_error(NGX_LOG_ALERT, ev->log, ngx_errno,"close() channel failed");}ngx_processes[ch.slot].channel[0] = -1;break;}

根据收到的命令类型,采取相应的动作。

整个通信的过程就是如此

nginx的master和worker进程间的通信相关推荐

  1. nginx源码分析--master和worker进程模型

    一.Nginx整体架构 正常执行中的nginx会有多个进程,最基本的有master process(监控进程,也叫做主进程)和woker process(工作进程),还可能有cache相关进程. 一个 ...

  2. Nginx进程间的通信机制

    概述 linux进程间通讯方式 在linux系统中进程之间的通讯方式有套接字.共享内存.消息队列.管道.信号 Nginx进程间通讯方式 Nginx选择其中的套接字.共享内存.信号作为同步master进 ...

  3. Storm通信机制,Worker进程间通信,Worker进程间通信分析,Worker进程间技术(Netty、ZeroMQ),Worker 内部通信技术(Disruptor)(来自学习资料)

    Storm通信机制 Worker间的通信经常需要通过网络跨节点进行,Storm使用ZeroMQ或Netty(0.9以后默认使用)作为进程间通信的消息框架. Worker进程内部通信:不同worker的 ...

  4. 深刻理解 Linux 进程间七大通信(IPC)

    前言 网络编程是 Linux C/C++的面试重点,今天我就来聊一聊进程间通信的问题,文章末尾列出了参考资料,希望帮助到大家. 篇幅有点长,希望大家耐心阅读. Linux 下的进程通信手段基本上是从 ...

  5. linux+Qt 下利用D-Bus进行进程间高效通信的三种方式

    linux+Qt 下利用D-Bus进行进程间高效通信的三种方式 原文链接: https://www.cnblogs.com/wwang/archive/2010/10/27/1862552.html ...

  6. 同步线程和进程间的通信

    最近回去学习了一下进程和进程间的通信,有时候很多东西久不看了也就一下子忘了== 这里面有好几个互斥对象使用线程的 1 void mListText(CString str) 2 { 3 m_list_ ...

  7. Android 使用AIDL实现进程间的通信

    在Android中,如果我们需要在不同进程间实现通信,就需要用到AIDL技术去完成. AIDL(android Interface Definition Language)是一种接口定义语言,编译器通 ...

  8. 【转载】进程间的通信之剪贴板方法实现源码

    1 源码无私奉献 2 3 void CClipboardDlg::OnBnClickedButton1() 4 { 5 // TODO: 在此添加控件通知处理程序代码 6 //打开剪贴板 7 if(O ...

  9. 进程间的通信IPC(无名管道和命名管道)

    进程间的通信IPC介绍 进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息. IPC的方式通常有管道(包括无名管道和命名管道).消息队列.信号量 ...

最新文章

  1. 一次HP 阵列卡排障
  2. SpringMVC 表单验证
  3. IntelliJ IDEA 前端调试(Js Debug)
  4. 5g通用模组是什么_广和通发布全新5G模组FG650,搭载展锐中国“芯”
  5. php获取当月天数及当月第一天及最后一天、上月第一天及最后一天实现方法
  6. 2011Google校园招聘笔试题
  7. java 什么时候进行垃圾回收_java什么时候进行垃圾回收,垃圾回收的执行流程
  8. Java实现Huffman哈夫曼树(数组实现)
  9. redisson的锁的类型_再有人问你分布式锁是什么,就把这个丢给他!
  10. Hadoop 系列 HDFS:分布式文件系统(HDFS文件读写)
  11. 高性能MMORPG服务端引擎设计之基本概念
  12. mysql介绍索引类型的章节_MySQL索引类型介绍
  13. joinquant : 通过query获取申万各级指数行情、估值等数据
  14. 实战攻防比赛中作为防守方需要做哪些工作
  15. 图片怎么存储到数据库里
  16. HR 信息系统运维制度
  17. 元气骑士如何获得机器人成就皮肤_元气骑士:新版本皮肤上架,隐藏皮肤这样才能获得,其实很简单...
  18. 闲聊机器人实例三:python实现小姜机器人(检索式chatbot_sentence_vec_by_word_词向量句向量)
  19. APP系列,学院专题讲座图像记录软件推荐
  20. win7各种插件的下载与使用

热门文章

  1. 一个网络公司的任职要求
  2. 16核64g服务器性能,16核64g云服务器
  3. python selenium自动化_python selenium自动化之-环境搭建
  4. python零基础入门教材-Python零基础入门到精通自学视频教程
  5. python利器的使用-Python数据科学利器
  6. python while循环语句-Python while循环语句
  7. python 数据分析学什么-利用Python做数据分析 需要学习哪些知识
  8. 软件工程python就业方向-女生学习软件工程专业就业怎么样?
  9. python就业方向有哪些-Python如何零基础入门?就业方向有哪些?
  10. python流程控制语句-4.python流程控制语句介绍