【Linux】进程间通信——匿名管道|命名管道

目录

什么是进程间通信

管道

匿名管道


什么是进程间通信

进程间通信,顾名思义就是两个进程互相通信。

可是进程是独立的,该如何通信呢?

类比你和你的朋友在网上聊天,你们两个人也是独立的,是如何通信的呢?因为你能看到你朋友给你发的消息,你朋友也能看到这份消息。这个消息就是一个公共的资源。

所以进程间如果要进行通信,就需要两个进程看到同一份资源。

那么,通信的地点在哪里呢?

很明显,因为进程之间是独立的,所以通信的地点肯定不能在进程中,只能在操作系统中。

结论:进程间通信的地点是操作系统。

进程间通信的方式有很多,一般有三种:

1.管道:通过文件系统通信。

  • 匿名管道
  • 命名管道

2. system V:聚焦在本地通信

  • 共享内存
  • 消息队列
  • 信号量

3. POSIX:让通信可以跨主机。

  • 共享内存
  • 消息队列
  • 信号量
  • 互斥量
  • 条件变量
  • 读写锁

本文主要讲管道的通信方式。

管道

回顾文件系统

当父进程打开一个文件时,创建了一个子进程。子进程会继承父进程,包括继承父进程的文件描述符。子进程和父进程相同的fd指向同一个文件。

到这里,通信的条件就具有了,因为父子进程看到了同一份文件。

说明:在冯诺依曼体系结构中,磁盘是外设。而外设的读取速度是比较慢的。但是在进程间通信时,他们并不关心磁盘中有什么文件 - - - 说白了就是不会和磁盘进行交互。于是为了提升效率,就直接关闭了和磁盘中文件的交互。所以,这种不进行IO通信的文件,叫做内存级文件

那么,如果是内存级文件,需要如何进行通信呢?

1.父进程将内容写入到内存(struct file的内存缓冲区)中,

2.子进程从内存(struct file的内存缓冲区)中读取数据。

总共发生两次拷贝

结论:通过文件系统提供公共资源的进程间通信,叫做管道。

匿名管道

理论

定义:匿名管道,就是没有名字的管道。

使用范围:只能子在父子之间,或者父亲的所有孩子(兄弟)之间进行通信,也就是具有血缘关系才能通信。

原理:

第一步:父进程打开管道

从图中可以看到,fd[0]对应的是读端,对应父进程的3号文件描述符,

fd[1]对应的是写端,对应父进程的4号文件描述符。

fd[0]就是读端   fd[1]就是写端

第二步:父进程创建子进程,子进程会继承父进程的文件描述符

到这里,父子进程通信的管道(途径)就建立好了,但是管道就像水管一样,只能单向通信。所以,我们如果想要父进程写入,子进程读取,就需要关闭父进程的读端,子进程的写端。

第三步:父进程关闭读端(写端),子进程关闭写端(读端)

实践

查看手册,查找pipe函数。

解读:pipe函数的形参是一个pipefd[2]的数组,该数组有两个元素,分别是fd[0]和fd[1];其中,pipefd[0]代表读端,pipefd[1]代表写端。

返回值:如果创建成功,返回0,否则返回-1。

实现通过管道使父子进程通信

打印结果:

匿名管道读写特征(四种)

1.读快,写慢

写入慢,读取快,read调用阻塞,即进程暂停执行,一直等到有数据来到为止

2.读慢,写快

写入快,读取慢,write调用阻塞,直到有进程读走数据

3.写入端关闭,读取端未关闭

管道写端对应的文件描述符被关闭,则read返回0

当写入端关闭了,读取端就没有等待的必要了,读取端的read()直接返回0,表示写入端关闭了。

4.读取端关闭,写入端未关闭

管道读端对应的文件描述符被关闭,则write操作会产生信号SIGPIPE让write进程退出

匿名管道实现简易进程池

processPool.cc文件

task.hpp文件

运行结果:

命名管道

理论

使用范围:命名管道可以实现任何进程之间的通信。
命名管道实现的过程:

第一步:创建命名管道

使用指令:mkfifo 文件名   创建命名管道

创建命名管道之后,该如何让不同的进程看到同一份资源呢?

首先,我们需要将这个命名管道做唯一标识。

其次,让不同的文件都通过这个唯一标识,就能确定双方找到的文件是同一份文件了。

就好像钥匙和锁一样。现在有很多钥匙,A进程手里10把要是,B进程手里10把钥匙,现在A和B进程都找自己的钥匙,只要能打开同一把锁,就是相同的钥匙。

如何做到唯一标识?

之前在文件系统中说到,为什么同一个目录下的文件不能重名?就是因为目录下存的是文件的文件名,目录通过文件名找文件,所以,不能重名。

这里同理,利用同一路径 + 文件名的方式唯一标识文件

第二步:进程之间使用命名管道通信

通信过程和匿名管道一样。

第三步:删除命名管道(如果不在程序中删除,就要自己手动删除)

使用指令:unlink 文件名

实践

创建命名管道

参数:

第一个参数是pathname,表示要创建的管道文件所在的路径文件名

第二个参数是权限,一般设置0666或者0664

作用:

创建一个命名管道

返回值:

如果创建成功,则返回0,否则返回-1

使用:

进程之间使用命名管道通信

实现命名管道通信,需要两个进程,我们姑且将两个进程命名为客户端(client)和服务端(sliver),客户端发信息,服务端接受信息。

客户端写入

服务端读取

服务端程序

只读端,打开管道文件的方式是O_RDONLY。

接下来就是文件描述符fd中读取sizeof(buffer)个字节内容到buffer中。为了方便观察,将buffer中的内容打印到显示器上。

客户端程序

写入端打开文件的时候使用O_WRONLY

之后将内容输入到line中,将line中的内容写入到fd中,拱读取端去读

实现进程间通信完整程序

实现日志

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/805215.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux常见使用命令

查看CPU内存 cat /proc/cpuinfo 动态查看 top 部分版本中没有,需要自行安装的命令 dstat 查看内核版本号 uname -r 系统版本的全部信息 uname -a 查看所有关于网络的相关信息 netstat -anp 查看8080端口是否被占用 netstat -anp | grep 8080 指定进程名字都有那些连…

Meta Earth:模块化公链的技术革新与市场潜力解析

随着加密货币市场逐渐回暖,投资者和技术爱好者都在寻找下一个重大机遇,特别是在比特币ETF获批和比特币减半事件的到来,全球加密货币市场正迎来新一轮的牛市周期。在此背景下,模块化公链技术作为区块链领域的一大创新点&#xff0c…

详解 node/浏览器 事件循环中的微任务的优先级

关于事件循环机制,可以参考这篇文章 node 环境中的微任务 这里面补充一个,node 中微任务是有优先级的,常见的微任务有,其中 process.nextTick 的优先级最高,会优先执行,剩下的按照进入微任务队列的顺序&a…

2024年第五届计算机视觉与信息技术国际会议(CVIT 2024)即将召开!

2024年第五届计算机视觉与信息技术国际会议(CVIT 2024)将于2024年8月16-18日在北京举行。CVIT 2024由北方工业大学主办,国内外的专家学者将齐聚一堂,共同分享最新的技术突破、研究方法和应用案例,共同推动计算机视觉与…

开启未来之门:Victoria VR 与 OpenAI 整合,引领 Web3 AI+AR 风潮

加密市场一直是科技创新的前沿阵地。虚拟现实(VR)技术和人工智能(AI)被认为是引领未来的重要技术之一,Web3 自然不会缺席这场足以改变人们生活方式的变革! 2月份,Apple Vision Pro 的发售迅速引…

Python爬虫网络实践:去哪儿旅游数据爬取指南

Python爬虫网络实践:去哪儿旅游数据爬取指南 在这个博客中,我们将探索如何使用 Python 来进行网络数据抓取,并以抓取旅游数据为例进行演示。我们将通过一个简单的示例来说明如何利用 Python 中的常用库进行网页抓取,从而获取旅游…

快速理解JS中的原型和原型链

快速理解JS中的原型和原型链 在我们学习JS的过程中,我们总会接触到一些词:“原型”,“原型链”。那么今天我就来带大家来学习学习原型和原型链的知识吧! 在开始之前,我们明确一下我们接下来想要学习的目标&#xff1a…

新型[datahelper@onionmail.org].datah 勒索病毒来袭:如何筑起安全防线?

在数字化时代,网络安全问题日益凸显,其中勒索病毒成为了一种非常严重的威胁。[datahelperonionmail.org].datah勒索病毒就是其中的佼佼者,它以其复杂的加密手段和恶劣的勒索行为,给用户带来了巨大的损失。本文将从病毒的运行机制、…

ModuleNotFoundError: No module named ‘mlxtend‘

from mlxtend.plotting import plot_decision_regions 报错信息: ModuleNotFoundError: No module named mlxtend Jupyter和Spyder报错原因:因为anaconda下没有这个模块,需要安装mlxtend 解决方案: 1.打开anaconda(或终端) 2. 点击路径点…

Python爬虫之Scrapy框架基础

Scrapy爬虫框架介绍 文档 英文文档中文文档 什么是scrapy 基于twisted搭建的异步爬虫框架. scrapy爬虫框架根据组件化设计理念和丰富的中间件, 使其成为了一个兼具高性能和高扩展的框架 scrapy提供的主要功能 具有优先级功能的调度器去重功能失败后的重试机制并发限制ip使用次…

完全可定制的富文本编辑器:逻辑清晰,插件赋能 | 开源日报 No.218

ianstormtaylor/slate Stars: 28.8k License: MIT slate 是一个完全可定制的框架,用于构建富文本编辑器。 可以构建类似 Medium、Dropbox Paper 或 Google Docs 的富文本编辑器通过一系列插件实现所有逻辑,避免代码复杂度受到 Draft.js、Prosemirror 和…

1.grpc-教程(golang版)

目录 一、介绍 二、环境准备 三、Golang中使用grpc 1.编写protobuf文件 2.服务端 3.客户端 四、proto文件详解 1.proto语法 2.数据类型 基本数据类型 数组类型 map类型 嵌套类型 编写风格 3.多服务 4.多个proto文件 五、流式传输 1.普通rpc 2.服务器流式 …

基于SVM的时间序列预测模型matlab代码

整理了基于SVM的时间序列预测模型matlab代码, 包含数据集。采用了四个评价指标R2、MAE、MBE、MAPE对模型的进行评价。SVM模型在数据集上表现非常好。 Mean squared error 0.000180613 (regression) Squared correlation coefficient 0.995639 (regression) Mea…

【进阶六】Python实现SDVRPTW常见求解算法——自适应大邻域算法(ALNS)

基于python语言,采用经典自适应大邻域算法(ALNS)对 带硬时间窗的需求拆分车辆路径规划问题(SDVRPTW) 进行求解。 目录 往期优质资源1. 适用场景2. 代码调整2.1 需求拆分2.2 需求拆分后的服务时长取值问题 3. 求解结果4…

信息收集-app,小程序,公众号,邮箱篇

*声明:*请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,文章作者不为此承担任何责任。合法渗透,本文章内容纯属虚构,如遇…

【linux】sudo 与 su/su -之间的区别

一、区别 二、其他 大概是因为使用 su 命令或直接以 root 用户身份登录有风险,所以,一些 Linux 发行版(如 Ubuntu)默认禁用 root 用户帐户。鼓励用户在需要 root 权限时使用 sudo 命令。 然而,您还是可以成功执行 su…

快速熟悉torchdiffeq用法,从数理逻辑到完整案例【第二、三部分】

本系列文章板块规划 提示:以下内容仅为个人学习感悟,无法保证完全的正确和权威,大家酌情食用谢谢。 第一部分 torchdiffeq背后的数理逻辑 第二部分 torchdiffeq的基本用法 第三部分 trochdiffeq的升级用法 第四部分 torchdifffeq的案例和代码…

Vue.js 过渡

过渡 Vue 在插入、更新或者移除 DOM 时&#xff0c;提供多种不同方式的应用过渡效果。 Vue 提供了内置的过渡封装组件&#xff0c;该组件用于包裹要实现过渡效果的组件。 语法格式&#xff1a; <transition name "nameoftransition"><div></div&…

数据库(mysql)-连接嵌套查询-2

子查询 MySQL中的子查询&#xff08;Subquery&#xff09;是嵌套在其他SQL查询中的查询。子查询可以出现在SELECT、FROM或WHERE子句中&#xff0c;并用于返回将被用于外部查询的数据。子查询的结果可以是一个单一的值、一行、一列或多行多列的数据集。 单行单列查询 实例 #查…

2023 年网络安全热点技术发展态势

文章目录 前言一、人工智能信息技术迎来井喷式发展期二、零信任网络安全架构即将投入实际部署三、美国全面推动军政业务向云环境迁移四、专用太空软硬件与独立卫星网络并行发展五、量子信息技术与网络安全领域加速融合前言 在 2023 年取得进展的信息技术不在少数。从网络安全的…