> 技术文档 > 【linux】进程间通信(IPC)——匿名管道,命名管道与System V内核方案的共享内存,以及消息队列和信号量的原理概述_linux ipc

【linux】进程间通信(IPC)——匿名管道,命名管道与System V内核方案的共享内存,以及消息队列和信号量的原理概述_linux ipc

目录

✈必备知识

进程间通信概述

🔥概述

🔥必要性

🔥原理

管道概述

🔥管道的本质

🔥管道的相关特性

🔥管道的同步与互斥机制

匿名管道

🔥系统调用接口介绍

🔥内核原理

🔥匿名管道小实战——进程池

命名管道

🔥概述

🔥创建命名管道的指令

🔥创建命名管道函数

system V共享内存

🔥概述

🔥系统调用接口

🔥代码示例

消息队列

🔥原理概述

🔥接口介绍

创建消息队列

向消息队列发送消息

从消息队列接收消息

控制消息队列

信号量

🔥概述

🔥接口介绍

OS管理共享内存,消息队列,信号量


🤗个人主页:东洛的克莱斯韦克

必备知识

进程地址空间

进程控制——进程创建,进程退出,进程等待

理解文件系统

进程间通信概述

🔥概述

进程间通信简称IPC,是在不同进程之间传播或交换信息的一种机制。

管道是基于内存级文件的通信方案

System V解决方案中有共享内存消息队列信号量。在POSIX IPC解决方案中有共享内存,消息队列信号量互斥量条件变量读写锁

这些通信方案在系统中都属于IPC资源

🔥必要性

每个进程都有自己的地址空间,这保证了进程的独立性。即使两个进程是父子关系,可以看到同一份数据,但只要有一方进行写入操作都会发生写时拷贝

进程A异常了,不会影响到进程B,进程C......本质上来讲进程的独立性是因为进程间的数据具有独立性。

进程具有独立性是在内核设计时就有的理念。但后来发现,进程有时相互传输数据是必要的,所以必须提出解决方案——不破坏进程的独立性又能实现进程的通信。

🔥原理

先让两个进程看到同一份公共资源,这公共资源可以是文件,也可以是一块内存。

进程A向公共资源写入数据,进程B向公共资源读数据。此时两个进程完成了数据的交互,这样进程A和进程B就实现了通信。

管道概述

🔥管道的本质

管道也是文件的一种,属于p类型的文件。管道文件属于公共资源,如果多个进程打开同一个管道文件,就能相互传输数据。

管道文件是内存级文件,它在磁盘中并没有对应的数据块来为它保存文件内容。系统只会在内存中为管道文件开辟文件缓冲区来保存数据。这样做避免了内存与外设的IO交互,提高进程间通信效率。

管道文件在磁盘中有个简单的映像,这个映像的大小为 0 ,这么做是为了让文件系统知道有这么一个文件存在。

🔥管道的相关特性

管道一般是单向通信——一方是读端,一方是写端 管道具有同步与互斥机制——保护数据 管道的生命周期随进程——被打开的文件的声明周期随进程 管道是面向字节流的

🔥管道的同步与互斥机制

同步与互斥机制是为了保护管道数据的安全

读写端都正常,管道为空,读端阻塞 读写端都正常,管道为满,写端阻塞 读端正常,写端关闭,读端会读到 0 ,相当于读到文件结尾,进程正常执行后续代码 读端关闭,写端正常,写端的进程会被信号杀掉,进程异常终止

匿名管道

匿名管道本质上是没有名字的内存级的文件——适用于具有血缘关系的进程

🔥系统调用接口介绍

头文件 #include 功能 : 创建匿名管道 原型 int pipe(int fd[2]); 参数 :fd文件描述符数组 , 其中 fd[0]表示读端 , fd[1]表示写端 返回值 : 成功返回 0 ,失败返回错误代码

🔥内核原理

在使用pipe系统调用之后,系统会为该进程分配两个文件描述符——files_struct数组下标。会有两个file结构体指向同一个文件缓冲区。分别以只读和只写打开文件缓冲区。

手游网游攻略