探索 Linux 下进程间通信的奥秘

1 进程间通信的介绍

1.1 进程间通信的目的

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

1.2 进程间通信的本质

多个进程间共享资源

1.3 进程间通信的主要方式

管道

  • 我们把从一个进程连接到另一个进程的一个数据流称为一个“管道”

共享内存

  • 共享内存是最快的IPC(进程间通信)形式。

2 管道(重点)

2.1 什么是管道

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

2.2 匿名管道

接口介绍
在这里插入图片描述
参数说明

功能:创建一匿名管道
fildes[2] : 文件描述符数组,fd[0] 代表读端,fd[1] 代表写端
返回值:成功返回0,失败返回错误代码

代码示例:创建匿名管道和父子进程,子进程负责写数据,父进程负责读数据
在这里插入图片描述
在这里插入图片描述
匿名管道的几个特性

  1. 如果写端进程(上面代码中是子进程),不不管文件描述符且不写入或者树写入的速度没有读端快,读端进程要被阻塞,读端进程状态从 R+ 到 S+
  2. 当写入进程进入数据到管道时候,如果此时管道数据已经满了,即写入条件不满足则写端进程需要阻塞。
  3. 如果写端进程关闭了文件描述符 fd ,则读端会读到文件的末尾读到 0 值 。
  4. 如果读端进程关闭文件描述符 fd ,写端进程会被 OS 系统发 SIGFIPE 信号干掉,上面的代码子进程就成了僵尸进程,需要父进程等待并回收子进程资源,以避免内存泄露。
  5. 匿名管道只能用于具有共同祖先的进程(具有亲缘关系的进程)之间的通信,通常一个管道由一个进程创建,然后该进程调用fork,此后父、子进程之间就可应用该管道,因为亲缘关系会进程管道文件信息
  6. 管道提供流式服务
  7. 一般而言,进程退出,管道释放,所以管道的生命周期随进程
  8. 一般而言,内核会对管道操作进行同步与互斥
  9. 管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道

2.3 命名管道

2.3.1 命名管道的概念

  • 匿名管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道
  • 如果我们想在不相关的进程之间交换数据,可以使用FIFO文件来做这项工作,它经常被称为命名管道。
  • 命名管道是一种特殊类型的文件

2.3.2 命名管道的创建方式

1、在命令行上创建命名管道
在这里插入图片描述
实现
在这里插入图片描述
在这里插入图片描述
2、命名管道还可以从程序中创建
在这里插入图片描述

2.3.3 命名管道和匿名管道的区别

  • 匿名管道由 pipe 函数创建并打开
  • 命名管道由 mkfifo 函数创建,打开用 open
  • FIFO (命名管道) 与 pipe (匿名管道) 之间唯一的区别在于它们创建与打开的方式不同,一旦这些工作完成后,它们具有相同的语义。

2.3.4 命名管道的打开规则

  • 如果当前打开操作是为了读而打开 FIFO 时,阻塞当前进程直到有相应进程为写而打开该 FIFO
  • 如果当前打开操作是为写而打开 FIFO 时,阻塞当前进程直到有相应进程为读而打开该 FIFO

2.3.5 用命名管道模拟实现服务器和客户端的通信

服务端(写端)
在这里插入图片描述
在这里插入图片描述
客户端(读端)

在这里插入图片描述

3 共享内存

3.1 共享内存介绍

共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间,这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据

共享内存示意图
在这里插入图片描述
共享内存在 Linux 内核源代码中,描述其的数据结构
在这里插入图片描述

在这里插入图片描述
创建共享内存的接口
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

4 进程互斥

  • 由于各进程要求共享资源,而且有些资源需要互斥使用,因此各进程间竞争使用这些资源,进程的这种关系为进程的互斥。
  • 系统中某些资源一次只允许一个进程使用,称这样的资源为临界资源或者互斥资源。
  • 在进程中涉及到互斥资源的程序段叫临界区
  • IPC 资源必须删除,否则不会自动清除,除非重启,所以 system V IPC 资源生命周期随内核

猜你喜欢

转载自blog.csdn.net/CZHLNN/article/details/115431405