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

匿名管道通信

1.进程为什么要通信?
进程是需要协同的,如何协同?- - 通信 - - 数据是有类别的,很多不同的数据。
进程具有独立性。进程 = 内核数据结构 + 代码和数据
2.进程如何通信?
a.进程通信,成本较高。
b.进程间通信的前提,先让不同的进程,看到同一份OS提供的资源。以通信为目的的资源就是一段内存。
通信:两个进程想要通信,由于进程本身具有独立性,因此自身不能够被对方看到。必须由OS开辟一段空间让这两个进程都看到这份空间。通过这个公共的空间进行通信。
普通通信方式:消息队列、共享内存、信号量。
复用内核代码的通信方式:管道- - a.命名管道 b.匿名管道

每个进程的task_struct相互独立。但其对应的文件描述是共用的。父进程创建子进程,子进程的task_struct 独立,但文件描述公共。这就是为什么每个进程的0 1 2文件描述符都打开的原因。因为每个进程都是bin的子进程。只要是bin的子进程,则都会自动继承打开文件描述的 0 1 2。
对应的,为什么子进程 close(0/1/2) 不会影响父进程?因为在 file中存在引用计数,这个计数显示了有多少个进程打开 0/1/2,单个进程close(0/1/2) 一次,只会让计数 - - 一次,只有减到0 才会真正关闭。

在下图情况下 ,父进程让OS打开文件、创建子进程之后,这个文件就可以称之为管道文件。 管道文件只允许单向通信。**原理:**正常情况是图1的情况。
但为了满足管道只能单向通信的要求,需要只指定一个为读,指定一个为写。如图二的情况。也就是说单向通信,让父子进程分别关掉自己不需要的文件描述符就行了。并且这里不需要将内容刷新到磁盘去。
在这里插入图片描述

管道文件使用的是文件系统的原理,但不能使用那一套接口,因为原来的接口会给磁盘刷新内容,而通信不需要。因此有新的接口为: pipe() 其实底层就是open,但它不会刷新磁盘内容,并且不需要带路径和文件名。在这里插入图片描述这就叫做匿名(管道)文件。 成功返回0。
pipefd[2]:数组有两个元素,pipefd[0] - - 代表的是管道的 读 端,pipefd[1] - - 代表的是管道的 写 端。
1.如果需要双向通信,只需要创建两个管道就可以了。
2.pipe会把内容刷新给其他进程,而不是磁盘。

如何使用管道通信?(模型为父进程读,子进程写,管道也是文件,用的就是read和write)
1.首先搭建框架:
步骤:
a. 创建管道,管道的输出参数为pipefd[2],这两个值一个是读,一个是写。创建管道成功返回的是0,创建失败非0.
b.创建子进程
c.关掉父进程的 写端(pipefd[1]),关掉子进程的 读端(pipefd[0])。
d.父进程阻塞等待子进程退出,避免僵尸进程。
2.子进程写入,父进程读。

管道的四种情况:
1.管道内部是空的或者 write fd没有关闭,则read fd 会一直等待。
2.管道被写满了,但是 read fd 没有关闭,则 write fd 就会一直阻塞。写端 一直等待。
3.管道一直在被读,但是write fd 关闭了,并且该进程直接关闭了对管道的描述符,则读端进程读完有效数据后 read 返回值会读到0,表示读到了文件结尾。
4.管道还在写,但是read fd 关闭了,则这种管道就称为:broken pipe(坏的管道),这种情况下,OS会直接杀掉 写入 的进程,就是异常情况,直接使用13号信号杀掉。
总结: 如果写入和读取不关闭他们的fd,则读写会自己等待。但如果 写端 关闭,再 读 的话就会读到0。如果 读端 关闭,还在 写 就会直接异常。

管道的五种特征:
1.匿名管道:只能用来进行父子进程间的通信。也就是说只能用 fork() 出来的进程进行通信,爷孙也可以。
2.管道内部自带进程之间的同步机制多执行流执行代码的时候,具有明显的顺序性
3.管道文件的生命周期是随进程的。
4.管道文件在通信的时候,是面向字节流的。
5.管道的通信模式,是一种 特殊的半双工(特殊在不能够双向通信) 模式。半双工:A在写入的时候,B不能读。B在读的时候,A不能写入。就是说 A 干活的时候,B 不能干活。全双工:A 在接受B 输入的时候,还可以给 B输出。

进程池:目的是 当面对大量的任务时,可以让任务们并发的去运行。为了提升效率,提前创建好各个进程,然后当任务来临时,父进程将任务写入对应的管道,子进程在对应的管道读取任务,也就是说通过管道下发任务让各个子进程去完成。模型如下:
在这里插入图片描述


http://www.kler.cn/a/504594.html

相关文章:

  • 深入浅出 Vue.js 渐进式加载图片组件开发
  • CSS 元素的显示模式(块元素,行内元素,行内块元素)
  • Nacos: 一个动态服务发现与配置管理平台
  • 【论文阅读】MAMBA+diffusion系列学习
  • 多线程锁
  • 00_专栏《Redis 7.x企业级开发实战教程》介绍
  • PostgreSQL 超级管理员详解
  • 青少年编程与数学 02-006 前端开发框架VUE 26课题、数据交互
  • 541. 反转字符串 II【力扣】
  • 怎样利用海外云手机进行引流?
  • 常用 Excel 快捷键
  • 微信小程序:中途退出原页面,再次进入无法回到退出时的位置
  • HTML基础与实践
  • OPT: Open Pre-trained Transformer语言模型
  • JavaScript系列(26)--安全编程实践详解
  • 《零基础Go语言算法实战》【题目 4-8】用 Go 语言设计一个遵循最近最少使用(LRU)缓存约束的数据结构
  • rtthread学习笔记系列--28 I2C驱动
  • 【C语言】【C++】Curl库的安装
  • 基于Python机器学习、深度学习技术提升气象、海洋、水文领域实践应用-以ENSO预测为例讲解
  • 机组存储系统