Linux下的IPC非常多,nginx的进程都是有亲缘关系的进程,对于他们的通信我们选择TCP socket进行通信。   TCP socket 用来做进程通信的优点有,   1.socket是文件描写叙述符,操作简单。 2.双向流动。3.另外另一个重要优点:可记录可重现,我们能够用tcpdump抓取信息,方便调试。

当然对于进程间大量数据的共享 自然而然的我们採用共享内存。

採用socketpair()函数创造匿名socket 为master process(父进程) 和 work  process(子进程)   以及work process 之间的通信。

关于socketpair()  參见这里就可以。

先看看nginx process 的定义

ngx_process.h

typedef struct {ngx_pid_t           pid;int                 status;ngx_socket_t        channel[2];//这里就是用来存放 socketpair 的两个描写叙述符ngx_spawn_proc_pt   proc;void               *data;

在nginx_process.c中

ngx_pid_t
ngx_spawn_process(ngx_cycle_t *cycle, ngx_spawn_proc_pt proc, void *data,char *name, ngx_int_t respawn)
{u_long     on;ngx_pid_t  pid;ngx_int_t  s;...if (socketpair(AF_UNIX, SOCK_STREAM, 0, ngx_processes[s].channel) == -1)  //注意是在fork之前哦{ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_errno,"socketpair() failed while spawning \"%s\"", name);return NGX_INVALID_PID;}
...pid=fork();
...

在运行fork之前,先调用 socketpair()创建一对socket 描写叙述符存放变量ngx_process[s].channel内,在fork()之后,子进程继承了父进程的这一对socket描写叙述符,Nginx此时会把channel[0]给父进程使用,把channel[1]给子进程使用。从这以后就能够实现父子进程的通信。

    if (ngx_add_channel_event(cycle, ngx_channel, NGX_READ_EVENT,ngx_channel_handler)   //子进程把channel增加到监听事件,ngx_channel_handler为事件响应的回调函数== NGX_ERROR){

那么子进程和子进程直接是怎么通信的呢?

实际上子进程work_process之间也是通过这些socket进行通信的  : master父进程每次fork一个新进程的时候都会把这个新进程的信息告知前面已经生成的子进程

在ngx_process_cycle.c中

ngx_pass_open_channel(ngx_cycle_t *cycle, ngx_channel_t *ch)
{ngx_int_t  i;for (i = 0; i < ngx_last_process; i++) {if (i == ngx_process_slot|| ngx_processes[i].pid == -1|| ngx_processes[i].channel[0] == -1){continue;}

參数ch包括了刚刚创建的新的子进程pid,进程信息,channel描写叙述符在全局数组中。

只是截至眼下,Nginx并没有子进程向父进程写入信息,子进程间的通信也没有实际用处。

这样子进程直接都有了各自的信息包含socket描写叙述符。这样能够彼此能够通过此完毕通信。

參考书籍:《深入剖析Nginx> 高群凯

Nginx开发从入门到精通

转载于:https://www.cnblogs.com/blfshiye/p/4349868.html

Nginx 进程间通信相关推荐

  1. php利用socket_pair进程通信,nginx 进程间通信-socketpair

    在nginx中,master进程与worker进程之间使用了一种全双工通信方式--socketpair.socketpair 函数成功执行后会创建一对已经建立连接的socket对,两个相互通信的进程分 ...

  2. Nginx进程间通信机制

    3种消息传递方式 1.共享内存 当多个进程共享同一块内存时,在任何一个进程修改了共享内存中的内容后,其它进程通过访问这段共享内存都能够得到修改后的内容. Nginx通过进程间共享数据的主要方式就是共享 ...

  3. 学习Nginx看这篇就够了

    0. NGINX的优点 响应速度快 单次请求响应快,高并发请求响应速度快 高扩展性 低耦合的模块设计框架使得可以扩展大量的第三方模块 高可靠性 每个worker进程相对独立 master进程在一个wo ...

  4. C/C++ Linux后台服务器开发高级架构师学习知识点路线总结(2021架构师篇完整版)

    C/C++ Linux后台服务器开发高级架构师学习知识点路线总结(2021架构师篇完整版) 前言: 小编之前有跟大家分享过一篇架构师体系知识点总结的文章,今天在原来的基础上有所改变更新(2021版). ...

  5. C/C++ Linux后台服务器开发高级架构师学习知识点路线总结(2022架构师篇完整版)

    C/C++ Linux后台服务器开发高级架构师学习知识点路线总结(2021架构师篇完整版) 前言: 小编之前有跟大家分享过一篇架构师体系知识点总结的文章,今天在原来的基础上有所改变更新(2021版). ...

  6. 2020年关于Linux的知识技术合集(基础入门到高级进阶)

    前言 本文介绍下Linux如何从入门开始到高级进阶的学习路线. 整个体系专注于服务器后台开发,知识点包括C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,Mon ...

  7. C/C++ Linux 后台服务器开发高级架构师学习知识路(架构师篇)

    @[前言: 小编从事c方面10多年的工作经验.今天跟大家分享一下我总结出来的一系列 C/C Linux后台服务器开发的学习路线.从Linux开发工程师-Linux后台开发工程师-Linux高级互联网架 ...

  8. nginx服务器模块、web请求处理机制及事件驱动模型、进程功能和进程间通信

    一:Nginx的模块化结构设计: 1.核心模块:指的是nginx服务器运行当中必不可少的模块,这些模块提供了最基本最核心的服务,比如权限控制.进程管理.错误日志.事件驱动.正则表达式解析等,nginx ...

  9. 2.nginx架构-LINUX进程间通信知识

    一:终端和进程的关系 小工具:ps,kill,strace介绍: ps:用来显示进程信息的命令: kill:用于往进程发送信号,比如命令kill -2 进程id,发送SIGINT信号,kill -1 ...

  10. 详解微服务技术中进程间通信

    以下文章来源方志朋的博客,回复"666"获面试宝典 在单体应用中,一个组件调用其它组组件时,是通过语言级的方法或者函数调用,而一个基于微服务的应用是运行于多个服务器上的分布式系统, ...

最新文章

  1. 前端小白用面向对象思想实现元素拖拽
  2. C++中常用的字符串函数
  3. 一起学设计模式 - 命令模式
  4. 选中条目android spinner的使用
  5. Silverlight-Visifire图表使用示例发布时空白页面的解决办法
  6. 探索cqrs和事件源_编写基于事件的CQRS读取模型
  7. 设计模式之 - 代理模式(Proxy Pattern)
  8. jq使用教程04_高校版教程
  9. PyQt5+爬虫打造磁力链接搜索工具
  10. 【python快速入门】—唐宇迪课程笔记
  11. FFmpeg获取视频正确的宽高比
  12. 十分钟学会如何用Python处理CSV文件
  13. GNU C++ 智能指针6-- 解析_Sp_counted_inplace类
  14. 小程序开发之页面布局
  15. geoserver 官方文档翻译(其一)----- CQL and ECQL cql_filter例子
  16. 基于.NET6的简单三层管理系统
  17. WRF实例运行(2)
  18. 浅谈物联网时代设备加密的重要性
  19. linux内核编译过程的最终总结版
  20. html在线翻译,html/http

热门文章

  1. new对象后的代码块(匿名类)
  2. DELPHI 初学.
  3. 为你的软件选择正确的许可证方案
  4. PHP学习之十二:自定义函数
  5. Android 整合新浪微博SDK问题
  6. 5 分钟掌握智联招聘网站爬取并保存到 MongoDB 数据库
  7. Nginx 为什么快到停不下来?
  8. 聊聊你们关心的视频号
  9. 大公司和小公司的抢人战,孰胜孰负?
  10. python中读取txt文件、统计其中所有字母出现的频度_python——pandas练习题6-10