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

Linux进程间通信(1)

1.IPC

1.什么是IPC?

Inter Process Communication


2.进程间通信常用的几种方式

1,管道通信:有名管道,无名管道
2,信号- 系统开销小
3,消息队列-内核的链表
4,信号量-计数器
5,共享内存
6,内存映射
7,套接字

2.无名管道

1.管道的概念  

本质
内核缓冲区
伪文件-不占用磁盘空间
特点:
两部分:
        读端,写端,对应两个文件描述符
        数据写端流入,读端流出
操作管理的进程被销毁之后,管道自动被释放
管道默认是阻塞的

2.管道的原理   pipe

内部实现方式:队列
       环形队列
       特点:先进先出
缓冲区大小
        默认4K
        大小会根据实际情况做适当调整

3.管道的局限性

队列:
      数据只能读取一次,不能重复读取
半双工:
      单工:遥控器
      半双工:对讲机     数据传输方向是单向的

      双工:电话

匿名管道

         适用于有血缘关心的进程    (父子进程)


 4.创建匿名管道

int pipe(int fd[2])
fd‐传出参数:
           fd[0]‐读端
           fd[1]‐写端
返回值:
       0:成功
      ‐1:创建失败

为什么是3和4呢?

看之前的linux标准文件描述符,它是按着顺序排列的,所以3是读端、4是写端

                                                             图一

5.父子进程使用管道通信

先创建管道再创建父子进程

父/子进程在读的时候,其写端要关闭

实现 ps aux| grep "bash" (终端)
数据重定向:dup2   

由图一知道:要重定向是因为默认是写到屏幕的,我们要改成写到管道里

6.管道的读写行为

读操作
         有数据
             read(fd[1]) 正常读,返回读出的字节数
         无数据
            写端被全部关闭,read返回0,相当于读文件到了尾部
            没有全部关闭
            read阻塞
写操作
        读端全部关闭
                  管道破裂,进程被终止
                               内核给当前进程发送信号SIGPIPE-13,默认处理动作
        读端没全部关闭
                  缓冲区写满了
                               write阻塞
                  缓冲区没满
                              write继续写,直到写满,阻塞
如何设置非阻塞?
                 默认读写两端都阻塞
                设置读端为非阻塞pipe(fd)
                      fcntl-变参函数
                              复制文件描述符-dup
                              修改文件属性-open的时候对应flag属性
                     设置方法     

//获取原来的flags
int flags = fcntl(fd[0],F+GETFL);
//设置新的flags
flag |=O_NONBLOCK;
fcntl(fd[0],F_SETFL,flags);
fcntl(fd[0],F_SETFL,flags);


 

http://www.dtcms.com/a/107172.html

相关文章:

  • 天梯赛 L2-025 分而治之
  • GoldenEye: 1靶场渗透
  • 第四章,动态路由介绍//////RIP
  • 【Kubernetes】如何使用 kubeadm 搭建 Kubernetes 集群?还有哪些部署工具?
  • 基于昇腾NPU的YOLOv8部署
  • redis一些常用的命令(1)
  • 【零基础入门unity游戏开发——2D篇】SortingGroup(排序分组)组件
  • acwing 每日一题4889. 空调II
  • WinForm真入门(4)——窗体和控件、属性和事件 的基本概念
  • NFC碰一碰到底是什么?具体有什么功能
  • Transformer
  • Vue.js状态管理利器:Vuex核心原理与实战指南
  • VRRP(虚拟路由器冗余协议)、虚拟路由器、master路由器、backup路由器
  • 【算法数学篇】试除法求约数
  • 最长公共子串
  • (六)ASCLIN_UART模块串口DMA模式
  • 完美解决Tensorboard: No dashboards are active for the current data set.问题
  • 云曦3月断网考
  • 48. 旋转图像
  • 图神经网络实战(PyTorch Geometric处理学术网络)
  • Rock Pi 5B Linux虚拟串口设置方法
  • 无人机无线图像回传技术解析!
  • 如果数据包的最后一段特别短,如何处理?
  • 【GPT入门】第31课 ollama运行私有化部署的模型与调试
  • Linux:线程的同步与互斥
  • 大模型提示工程中,提示、补全、指令、上下文和样本这几个概念的区别是什么?
  • C/C++归纳2
  • with queue_lock: 是什么意思
  • 跨境贸易之常见的贸易术语(贸易模式)
  • 代码随想录第三十三天|动态规划part04--494.目标和、1049.最后一块石头的重量Ⅱ、474.一和零