当前位置: 首页 > news >正文

进程间通信 ─── linux第22课

进程间具有独立性 ,但是进程之间也需要数据传递等 ,管道应运而生.

进程间通信

进程间通信本质: 先让不同进程看到同一份资源.

进程间通信目的

  • 数据传输:⼀个进程需要将它的数据发送给另⼀个进程
  • 资源共享:多个进程之间共享同样的资源。
  • 通知事件:⼀个进程需要向另⼀个或⼀组进程发送消息,通知它(它们)发生了某种事件(如进 程终⽌时要通知父进程)。
  • 进程控制:有些进程希望完全控制另⼀个进程的执行(如Debug进程),此时控制进程希望能够 拦截另⼀个进程的所有陷⼊和异常,并能够及时知道它的状态改变。

进程间通信的发展

  • 管道
  • System V进程间通信
  •  POSIX进程间通信

进程间通信分类

1. 管道

匿名管道pipe

命名管道

2. System V IPC

System V 消息队列

System V 共享内存

 System V 信号量

3. POSIX IPC  

消息队列

共享内存

信号量

互斥量

条件变量

读写锁

管道

什么是管道

  • 管道是Unix中最古老的进程间通信的形式。(只能单项通信)
  • 我们把从⼀个进程连接到另⼀个进程的⼀个数据流称为⼀个“管道”

我们原来在命令行使用的管道 |  ,在命令行中集连了两个命令

站在文件描述符角度-深度理解管道

        下面是进程打开同一个文件后 ,在创建子进程的情况 ,我们可以发现在内存中加载的文件内核缓冲区可以同时被两个进程都看到(进程的内核数据结构+ struct file 被拷贝 ,文件部分不需要拷贝)

        补充:

  • 文件只需要打开一次即可 ,多进程打开时 文件的引用计数++ 
  •  struct file中存储着各自进程对该文件的读写位置 ,父子进程对文件从读写位置是独立的 , 所以在创建子进程时需要拷贝struct file  

        在此管道中   读是通过一个struct file    写是通过另一个struct file 

问题

        要是不关闭管道?  导致fd泄漏&&误操作

        先创建管道到再创建子进程,父子进程才能看到同一个管道

站在内核角度-管道本质

匿名管道

        利用上面的原理,设计了一种文件(纯内存级 ,与磁盘外设无关 ,没有名字 ),通过它可以实现进程间通信.

        创建匿名管道用系统调用命令 ─── pipe

#include <unistd.h>
功能:创建⼀⽆名管道
原型
    int pipe(int fd[2]);
参数
    输出型参数fd:⽂件描述符数组, 其中fd[0]表⽰读端, fd[1]表⽰写端

返回值:成功返回0,失败返回错误代码

相关文章:

  • STM32 的tf卡驱动
  • DAY37 动态归化Ⅰ基础题目
  • 深入LangChain:LLM交互机制与RAG集成的技术
  • 三主热备架构
  • 原生微信小程序基础语法--快速总结
  • 架构师面试(二十):CAP 定理
  • 自定义mavlink 生成wireshark wlua插件错误(已解决)
  • 【拒绝算法PUA】LeetCode 2116. 判断一个括号字符串是否有效
  • VLM理解(一)——视觉文本信息的标注与数据集制作过程
  • 第十一章 | 智能合约主网部署与验证详解
  • 6、linux c 线程 -下
  • 同旺科技USB to I2C 适配器 ---- 多从机设备混合调试
  • 关于解决Ubuntu终端及系统字体大小的问题
  • Java 24 学习
  • WebSocket:现代实时通信协议的深度解析与实践
  • Mysql笔记
  • el-table单元格编辑,动态增删行,回车/上下左右箭头切换单元格
  • cpp-友元
  • 马科维茨均值—方差理论推导过程
  • 分布式系统设计陷阱,白话CAP理论
  • 江西省国资委原副主任李键主动向组织交代问题,接受审查调查
  • 央行副行长:增强外汇市场韧性,坚决对市场顺周期行为进行纠偏
  • 劳动最光荣!2426人受到表彰
  • 传智教育连续3个交易日跌停:去年净利润由盈转亏
  • 伊朗港口爆炸已造成281人受伤
  • 马上评丨喷淋头全是摆设,酒店消防岂能“零设防”