Linux——进程间通信——匿名管道详解

1.进程间通信介绍

1.1为什么会有进程间通信?

  • 每一个进程都是拥有自己独立的虚拟地址空间和页表结构,促使了进程独立,同时带来了进程和进程之间相互协作的问题。所以就引入了进程间通信,而最大的进程间通信叫网络

1.2进程间通信的目的

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

2.进程间通信——管道

2.1管道的引入

在这里插入图片描述

2.2什么是管道呢?

在这里插入图片描述

2.2管道——匿名管道

2.2.1创建匿名管道的接口

在这里插入图片描述
在这里插入图片描述

2.2.2匿名管道的特性

2.2.2.1匿名管道只能用于具有亲缘关系的进程之间

在这里插入图片描述

  • 所以管道的数据流是一个方向,数据流只能从写端到读端,所以管道是一个半双工通信(要么A给B说,要么B给A说)
2.2.2.2匿名管道是提供字节流服务的

在这里插入图片描述

  • 提供字节流服务的意思就是,比如说读入,我们可以读hello-world也可以读world,类似这种读入数据的行为
2.2.2.3管道的大小是64K(65536)

在这里插入图片描述

  • 此时读写的过程都是基于文件描述符是阻塞属性
2.2.2.4创建匿名管道返回的文件描述符属性默认是阻塞的
2.2.2.5 如何将文件描述符设置为非阻塞的呢?
  • 我们有一个fcntl函数
    在这里插入图片描述

  • 函数的返回值是文件描述符的属性,使用的是位图的方式

  • 若要设置非阻塞属性时,著需要给原来的属性按位或 O_NUNBLOCK
    在这里插入图片描述
    在这里插入图片描述

  • 我们可以在如下这个文件当中查看对应的属性的定义
    在这里插入图片描述

  • 结合我们之前学到的readwrite我们来看看两个读和写的二进制码
    在这里插入图片描述
    在这里插入图片描述

  • 这就和上面的二进制码对上了,和 O_NUNBLOCK位或就将文件属性改成了非阻塞

2.3创建一个匿名管道,更改对应读写端的文件描述符为非阻塞属性

2.3.1不进行读,但是一直写;设置写端的文件描述符为非阻塞属性,不用设置读端文件描述符,因为没有用到

2.3.1.1读端不关闭,写端一直写,wirte会返回-1,报错当前资源不可用

在这里插入图片描述

2.3.1.2读端直接关掉,写端一直在写,当前进程会收到SIGPIPE信号,写端的程序直接被杀死,这种现象叫做管道破裂

在这里插入图片描述

2.3.1.3如何证明退出的时候收到SIGPIPE信号?

在这里插入图片描述

2.3.2不进行写,但是一直读,只需将读端设置为非阻塞,写端可以不用关心,因为没用到写端

2.3.2.1 写端不关闭,读端一直读,read调用返回-1,返回资源不可用

在这里插入图片描述

2.3.2.2写端关闭,读端进行读,read是正常调用的,read返回的是读到的字节数

在这里插入图片描述

  • 6
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值