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

进程间通信

  • 1.进程间通信介绍
    • 1.1为什么会有进程间通信?
    • 1.2进程间通信的目的
  • 2.进程间通信——管道
    • 2.1管道的引入
    • 2.2什么是管道呢?
    • 2.2管道——匿名管道
      • 2.2.1创建匿名管道的接口
      • 2.2.2匿名管道的特性
        • 2.2.2.1匿名管道只能用于具有亲缘关系的进程之间
        • 2.2.2.2匿名管道是提供字节流服务的
        • 2.2.2.3管道的大小是64K(65536)
        • 2.2.2.4创建匿名管道返回的文件描述符属性默认是阻塞的
        • 2.2.2.5 如何将文件描述符设置为非阻塞的呢?
    • 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返回的是读到的字节数

1.进程间通信介绍

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

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

1.2进程间通信的目的

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

2.进程间通信——管道

2.1管道的引入

Linux——进程间通信——匿名管道详解_第1张图片

2.2什么是管道呢?

Linux——进程间通信——匿名管道详解_第2张图片

2.2管道——匿名管道

2.2.1创建匿名管道的接口

Linux——进程间通信——匿名管道详解_第3张图片
Linux——进程间通信——匿名管道详解_第4张图片

2.2.2匿名管道的特性

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

Linux——进程间通信——匿名管道详解_第5张图片

  • 所以管道的数据流是一个方向,数据流只能从写端到读端,所以管道是一个半双工通信(要么A给B说,要么B给A说)

2.2.2.2匿名管道是提供字节流服务的

Linux——进程间通信——匿名管道详解_第6张图片

  • 提供字节流服务的意思就是,比如说读入,我们可以读hello-world也可以读world,类似这种读入数据的行为

2.2.2.3管道的大小是64K(65536)

在这里插入图片描述

  • 此时读写的过程都是基于文件描述符是阻塞属性

2.2.2.4创建匿名管道返回的文件描述符属性默认是阻塞的

2.2.2.5 如何将文件描述符设置为非阻塞的呢?

  • 我们有一个fcntl函数
    Linux——进程间通信——匿名管道详解_第7张图片

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

  • 若要设置非阻塞属性时,著需要给原来的属性按位或 O_NUNBLOCK
    Linux——进程间通信——匿名管道详解_第8张图片
    Linux——进程间通信——匿名管道详解_第9张图片

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

  • 结合我们之前学到的readwrite我们来看看两个读和写的二进制码
    在这里插入图片描述
    Linux——进程间通信——匿名管道详解_第10张图片

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

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

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

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

Linux——进程间通信——匿名管道详解_第11张图片

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

Linux——进程间通信——匿名管道详解_第12张图片

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

Linux——进程间通信——匿名管道详解_第13张图片

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

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

Linux——进程间通信——匿名管道详解_第14张图片

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

Linux——进程间通信——匿名管道详解_第15张图片

你可能感兴趣的:(Linux,网络,管道,匿名管道,linux,进程通信)