【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中,拱读取端去读

实现进程间通信完整程序

实现日志

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C#学习笔记10:winform上位机与西门子PLC网口通信_中篇_winform的窗口操作设计、日志的添加使用

今日继续我的C#winform上位机学习之路 这系列笔记的目标是尝试编写一个能够与西门子PLC进行以太网口通信的上位机软件。 文章提供完整代码解释、设计点解释、测试效果图、完整工程下载 本章主要学习:Winform多个窗体的一些操作 、无边框窗体的创建、Combox组件插…

Linux:文本编辑器 - vim

Linux:文本编辑器 - vim vim基本操作普通模式模式切换移动光标复制粘贴删除替换撤销 底行模式行号查找 vim基本操作 Vim(Vi Improved)是一款功能强大的文本编辑器,是Unix/Linux系统中广泛使用的编辑器之一。它源于上世纪70年代开发的Vi编辑器&#xff0…

Understanding Diffusion Models: A Unified Perspective翻译和公式补充解读

“Understanding Diffusion Models: A Unified Perspective”是一篇写的非常好的扩散模型DDPM数学原理解读文章,这里翻译了一遍,对于一些细节补充记录一下,方便对照原文更好的理解。 这篇文章作者是Calvin Luo,来自Google Resear…

激活黑科技

下载/如何使用它? 方法 1 - PowerShell(推荐)Method 1 - PowerShell (Recommended) 右键单击 Windows 开始菜单,然后选择“PowerShell”或“终端(非 CMD)”。复制粘贴以下代码&…

ChatGLM3-6B大语言模型离线执行

ChatGLM3-6B大语言模型离线执行 模型准备 一般而言,模型和模型参数可以通过如下三个模型源进行相应的下载: HuggingFace | ModelScope | WiseModel 本实例中,使用的是HuggingFace的源下载,相应的地址如下: HuggingFa…

在线视频下载工具lux(原annie)安装及使用教程

安装教程 下载ffmpeg,参考这篇文章:Python——Windows下载ffmpeg由于博主的系统为windows,所以选择不安装lux,直接下载.exe文件,进入lux的github网站后,选择右侧的Releases,下载下图的windows …

求职要做在线人才测评,如果找人代做会被发现吗?

理论上都有办法能避开,这种在线测评的一定都有这个弊端,什么录音,录屏,录像,只要你愿意琢磨下,就一定有办法避开,除非是现场有人看着你。 但是我的观点是没必要作弊,使这个巧&…

起诉状与反诉状有什么不同,二者在写法上有何区别?李秘书讲写作教教你!

起诉状与反诉状有什么不同,二者在写法上有何区别?李秘书讲写作教教你! 起诉状和反诉状在民事诉讼中各自扮演着不同的角色,因此它们在内容和写法上有一些不同。#李秘书讲写作#这节就讲这个话题。 起诉状是原告向人民法院提起诉讼…

从 0 搭建公司Jenkins服务 Centos7

从 0 搭建公司Jenkins服务 Centos7 安装 (运维人员) 安装环境 配置DNS安装JDK17安装Jenkins安装Docker安装GIT安装Ansible启动Jenkins安装插件配置凭据配置共享库配置 (开发经理)使用 (开发、测试人员) 安装 (运维人员) 安装环境 配置DNS 新安装系统的服务器无法解析域名&a…

为什么选择成为一名程序员

选择成为一名程序员,其背后的原因往往既包含兴趣,也包含职业发展的考量。对于我来说,这两者并不是孤立的,而是相互交织,共同推动步入这一行业。 兴趣是选择成为程序员的重要驱动力。编程本身就是一种创造和解决问题的…

Calibre:如何在runset中设置LVS box

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧? 拾陆楼知识星球入口 相关文章链接: Calibre:LVS 流程 在“Calibre: LVS 流程”文章里介绍了再rule file和图形界面如何设置lvs box,这里再分享一种lvs box设置方法: 通常我们会保存runset文件

CSS 基础:border 的 3 个基础属性和简写方法

你好,我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。大专生,一枚程序媛,感谢关注。回复 “前端基础题”,可免费获得前端基础 100 题汇总,回复 “前端工具”,可获取 Web 开发工具合集 264篇…

SpringCloudAlibaba-整合nacos(二)

目录地址: SpringCloudAlibaba整合-CSDN博客 一、nacos服务部分 1.下载nacos,并执行数据库脚本:nacos-mysql.sql 2.修改配置文件,配置mysql 3.启动nacos ./startup.sh -m standalone 4.访问:http://127.0.0.1:884…

Golang快速入门教程(一)

目录 一、环境搭建 1.windows安装 2.linux安装 3.开发工具 二、变量定义与输入输出 1.变量定义 2.全局变量与局部变量 3.定义多个变量 4.常量定义 5.命名规范 6.输出 7.输入 三、基本数据类型 1.整数型 2.浮点型 3.字符型 4.字符串类型 转义字符 多行字符…

基于51单片机的多床位病房呼叫器Proteus仿真

地址:https://pan.baidu.com/s/1WLTBD9WaWncZS_uRSjM-iA 提取码:1234 仿真图: 芯片/模块的特点: AT89C52/AT89C51简介: AT89C52/AT89C51是一款经典的8位单片机,是意法半导体(STMicroelectroni…

企业微信认证后可以修改主体吗?

企业微信变更主体有什么作用?如果原有的公司注销了,或者要更换一家公司主体来运营企业微信,那么就可以进行变更主体,变更主体后才可以保留原来企业微信上的所有用户,否则就只能重新申请重新积累用户了。企业微信变更主…

机器学习和深度学习--李宏毅(笔记与个人理解)Day9

Day9 Logistic Regression(内涵,熵和交叉熵的详解) 中间打了一天的gta5,图书馆闭馆正好npy 不舒服那天天气不好,哈哈哈哈哈总之各种理由吧,导致昨天没弄起来,今天补更! 这里重点注意…

面向对象设计原则实验“依赖倒置原则”

高层模块不应该依赖于低层模块。二者都应该依赖于抽象。抽象不应该依赖于细节。细节应该依赖于抽象。 (开闭原则、里氏代换原则和依赖倒转原则的三个实例很相似,原因是它之间的关系很紧密,在实现很多重构时通常需要同时使用这三个原则。开闭…

【智能优化算法详解】粒子群算法PSO量子粒子群算法QPSO

1.粒子群算法PSO 博主言简意赅总结-算法思想:大方向下个体自学习探索群体交流共享 对比适应度找到最优点 背景 粒子群算法,也称粒子群优化算法或鸟群觅食算法(Particle Swarm Optimization), 缩写为 PSO。粒子群…

HarmonyOS实战开发-如何实现文件管理相关的功能。

介绍 本示例主要展示了文件管理相关的功能,使用ohos.multimedia.medialibrary 、ohos.filemanagement.userFileManager 、ohos.fileio 、ohos.file.fs、ohos.app.ability.contextConstant 等接口,实现了增添文件、删除文件、查找指定类型文件文件、复制…