进程间通信

news/2024/10/25 13:28:48/

进程间通信

进程间通信是不同进程之间的信息传输或交换。在不同的过程中,双方可以访问哪些媒体?进程的用户空间相互独立。一般来说,他们不能互相接触。唯一的例外是共享内存区域。此外,系统空间是一个“公共场所”,所有进程都可以访问它,因此内核也可以提供这样的条件。此外,还有双方都可以访问的外围设备。当然,从这个意义上讲,两个进程也可以通过磁盘上的普通文件,或通过“注册表”或其他数据库中的一些表条目和记录来交换信息。从广义上讲,这也是进程间通信的一种手段,但通常不被视为“进程间通信”。

进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息。IPC的方式通常有管道(包括匿名管道和命名管道)、消息队列、信号量、共享内存等。
因为进程具有独立性,如果两个或者多个进程需要相互通信,就必须要看到同一份资源:就是一段内存这个内存可能以文件的方式提供,也可能以队列的方式,也可能提供的就是原始的内存块
这个公共资源应该属于谁?这个公共资源肯定不属于任何进程,如果这个资源属于进程,这个资源就不应该再让其它进程看到,要不然进程的独立性怎么保证呢?所以这个资源只能属于操作系统!
进程间通信的前提:是有OS参与,提供一份所有通信进程能看到的公共资源!

进程间通信的目的

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


管道

那么提到进程间通信我们就要说到管道

管道是以一个文件的形式充当两个进程间通信的桥梁

一端写入 另外一段读出

这里就要提到 为什么管道文件是存储在内存 而不是磁盘中呢

因为内存的读取和传输速率都是要高于磁盘的 因此我们把管道文件放在内存中

 

可以看到我们可以创建有名管道 然后使用 open函数在一端进行写操作

再另外一端进行读操作

我们可以再Linux中用文件操作的方式来模拟进程间通信

 

我们可以看到 我们先打开一个管道文件 然后 循环的输入

最后将循环输入的内容存储到管道文件中

然后我们就需要从另外一端进行读操作

 

这样我们就模拟实现了一个进程间通信

那么基于管道的进程间通信

它会有以下特点

 

 半双工的意思就是它只能从一端进行输入 然后一端进行读操作

然后 管道中的写端和读端会相互影响

这就是半双工

在后续的学习中我们会学习到套接字文件 这个的工作特点就是全双工

类似于微信好友互相聊天 可以一端实现读操作的时候进行写操作

复制文件描述符

在 Linux 系统中,open 返回得到的文件描述符 fd 可以进行复制,复制成功之后可以得到一个新的文件描述符,使用新的文件描述符和旧的文件描述符都可以对文件进行 IO 操作,复制得到的文件描述符和旧的文件描述符拥有相同的权限,譬如使用旧的文件描述符对文件有读写权限,那么新的文件描述符同样也具有读写权限;在 Linux 系统下,可以使用 dup 或 dup2 这两个系统调用对文件描述符进行复制,

 

因为复制得到的文件描述符与旧的文件描述符指向的是同一个文件表,所以可知,这两个文件描述符的属性是一样,譬如对文件的读写权限、文件状态标志、文件偏移量等,所以从这里也可知道“复制”的含义实则是复制文件表。同样,在使用完毕之后也需要使用 close 来关闭文件描述符。

dup

oldfd:需要被复制的文件描述符。
返回值:成功时将返回一个新的文件描述符,由操作系统分配,分配置原则遵循文件描述符分配原则;如果复制失败将返回-1,并且会设置 errno 值。 

dup 2

oldfd:需要被复制的文件描述符。
newfd:指定一个文件描述符(需要指定一个当前进程没有使用到的文件描述符)。
返回值:成功时将返回一个新的文件描述符,也就是手动指定的文件描述符 newfd;如果复制失败将返回-1,并且会设置 errno 值。

信号量

 

 

/


http://www.ppmy.cn/news/5776.html

相关文章

力扣(15.18)补9.19

15.三数之和 我以为不会太难,md不会。 其实很让我惊讶的是,双指针用了2层循环但复杂度确是O(n)。牛🐮🐮🐮🐮🐮🐮🐮🐮🐮&am…

【Python基础】内置函数

Python内置函数 1 abs(x) 返回数字x的绝对值或复数的模 2 all(iterable) 如果对于可迭代对象中所有元素x都等价于True,即对所有元素x都有bool(x)等于True,则返回True;对于空的可迭代对象也返回True 3 any(iterable) 只要可迭代对象iter…

Python中转义字符是个啥

文章目录前言一、转义字符是什么?二、常见的转义字符有哪些?总结前言 昨天有粉丝问了我这个代码问题,如下图: 他很好奇代码都没有错误,怎么运行就报错,不知道有咩有小伙伴能看出问题在哪呢? 其…

Redis - Redis持久化:AOF和RDB

1. 为什么要持久化 Redis是内从数据库,宕机后数据会丢失;Redis重启后,为了快速恢复数据,提供了持久化机制;Redis有两种持久化方式:RDB和AOF,这也是Redis无畏宕机与快速恢复数据的杀手锏。 注意…

5G MEC UPF选择及本地分流技术分析

【摘 要】边缘计算的本质是一场架构革命,为满足超低时延和超大带宽等业务需求,应用从传统Client-Server架构转向Client-Edge-Server三级架构,实现云网融合。在5G网络中,如何为边缘应用选择合适的UPF,实现高效的本地分流成为关键问题。为解决这个问题,分析了采用5G核心网…

vue-element 表单校验

1. 表单校验 完整的表单校验需要三个组件完成配合,分别是el-form,el-form-item,表单项,如el-input el-form 负责绑定model和rulesel-form-item 负责绑定propel-input 负责双向绑定具体的表单数据 手动兜底校验 1.1 表单项校验 1.1.1 内置校验规则 在Rules:{}中给每一个需要…

Godzilla(哥斯拉)安装与使用

Godzilla安装与使用1.Godzilla介绍2.Godzliia下载与安装2.1.Godzilla下载2.2.运行环境2.3.Godzilla安装2.3.1.执行文件2.3.2.安装完成3.Godzliia3.1.Godzliia使用3.1.1.生成木马3.1.2.存储木马3.1.3.放入木马3.1.4.访问木马3.1.5.连接木马3.1.6.测试连接3.1.7.连接进入3.2.Godz…

要学的东西太多了怎么办

一、前言 为什么要写这篇博客,一方面是自己最近遇到一些事情然后刚想清楚,一方面是跟以前的同事朋友们聊天,发现他们都很沮丧,感叹学不完的知识以及焦虑年龄会影响职业生涯。在群上劝他们的我似乎成了那个唯一的奋斗逼&#xff0c…