Linux管道 有名管道(FIFO)工作机制全解:从理论到实践
有名管道(重要)
有名管道/命名管道,主要用于没有血缘关系进程间的通信
当然也支持有血缘关系的情况,只是如果有血缘关系,没有必要使用有名管道,无名管道效果更佳
引入
好了,现在使用条件有了,该如何实现呢?
不同进程都有自己的独立空间,那如何将不同进程联系起来呢?
可以通过 磁盘内的文件(用于磁盘映射),物理内存,寄存器,数据库,第三方电脑等等,只要是不同进程都可以识别,并不是但属于一个进程的即可。
当然利用不同方式实现肯定是不同的方法,这里主要是带大家一步步地去实现有名管道。
这里我们实现有名管道的方式 是借助物理内存。
那么,问题又来了:物理内存是属于底层的,该如何操作物理内存呢?
物理内存偏底层,我们直接操作,我们目前做不到,也不是我们的重点。
我们说过,在Linux一切皆可视为文件,因此在这里我们通过将物理内存抽象为文件名,两个进程通过操作这个文件名,来实现进程间的通信。
因此这时候的物理内存就是一个管道,抽象出来的文件名,也就是有名管道,有名的来源。
这里简单说一下虚拟区别和物理内存的区别
在每个进程开始,系统会为每一个进程分配4GB的虚拟内存空间,这4GB是虚拟的。
而物理内存是切实存在的。
大家可以使用下面这张图来理解
有名管道的概述
特点
- 半双工,同一时刻只能在一个方向上流动
- 写入FIFO中的数据遵循先入先出的规则
- 传送数据无格式,事先必须约定好数据格式,如多少个字节算一个消息等
- FIFO在文件系统中作为一个特殊的文件而存在,但是它的实际内存却存放在物理内存
- 管道在内存中对应一个缓冲区,系统不同其大小也不同
- FIFO读取数据是一次性的,数据一旦被读取,就会被FIFO抛弃,释放其空间以存放更多数据
- 使用FIFO的进程退出后,FIFO文件将继续保存在文件系统中以便于以后使用
- FIFO 有名字,不相关的进程可以通过打开命名管道进行通信
有名管道的API
函数介绍
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo( const char *pathname, mode_t mode);
功能介绍
用于有名管道文件的创建(将物理内存抽象为文件)
参数
pathname:FIFO的路径名+文件名
mode:mode_t类型的权限描述符
返回值
成功:返回0
失败:返回-1,并设置errno
代码案例
00_read.c
在我的文件中文件名是 00_Bob.c
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/types.h>
#include <unistd.h>int main(int argc, char const *argv[])
{//创建有名管道文件mkfifo("my_fifo",0666);//作为收端,以读的方式打开文件//这里因为文件是我们创建的,已知文件一定存在,不需要添加O_CREAT行为标志int fd = open("my_fifo",O_RDONLY);if(fd == -1){perror("open");_exit(-1);}printf("收端已准备就绪\n");//读数据while(1){char buf[128] = "";read(fd,buf,sizeof(buf));printf("读到的数据为:%s\n",buf);if(strcmp(buf,"bye") == 0){break;}}//关闭文件close(fd);unlink("my_fifo");return 0;
}
00_write.c
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
int main(int argc, char const *argv[])
{//打开有名管道文件 这里我建议读写端都打开文件,因为我们不知道哪个进程会先打开//又由于mkfifo文件重复 会返回-1 因此这里我们不进行打开错误判断mkfifo("my_fifo",0666);//Lucy负责发 以写的方式打开该文件int fd = open("my_fifo",O_WRONLY);if(fd == -1){perror("open");_exit(-1);}printf("发端准备就绪\n");//写入数据while(1){//手动输入数据printf("输入数据:");char buf[128] = "";fgets(buf,sizeof(buf),stdin);buf[strlen(buf) - 1] = 0;write(fd,buf,strlen(buf));if(strcmp(buf,"bye") == 0){break;}}//关闭文件 close(fd);unlink("my_fifo");return 0;
}
代码运行结果:
在我的文件中文件名是 00_Lucy.c
有名管道的读写特点
1、open 以只读方式打开 FIFO 时,要阻塞到某个进程为写而打开此 FIFO
2、open 以只写方式打开 FIFO 时,要阻塞到某个进程为读而打开此 FIFO。
3、open 以只读、只写方式打开 FIFO 时会阻塞,调用 read 函数从 FIFO 里读数据时 read 也会阻塞。
4、通信过程中若写进程先退出了,则调用 read 函数从 FIFO 里读数据时不阻塞;若写进程又重新运行,则调用 read 函数从 FIFO 里读数据时又恢复阻塞。
5、通信过程中,读进程退出后,写进程向命名管道内写数据时,写进程也会(收到 SIGPIPE 信号)退出。
6、调用 write 函数向 FIFO 里写数据,当缓冲区已满时 write 也会阻塞。
解释
打开通道时,必须读端和写端都要打开
打开后
关闭读端,写端一旦写入,会导致写进程退出
关闭写端,读端可以继续读(此时被阻塞),写端重新运行,读端可以读,但会被阻塞
这里大家可以理解为一个水管,写为进水口,读为出水口
出水口堵住了,再向内灌水,水管就会坏,因此会导致进水口也关闭
进水口堵住了,但是出水口仍可以打开,最差的结果也就是不出水
代码思想补充
我们可以知道上面的例子中代码重复部分过多,会显得内容优点冗余,因此为了降低代码的冗余度,我们将上面两个代码合二为一,使用的是条件编译 对代码进行删减
今天时间原因,不给大家进行代码演示了,将在下篇分享中为大家补充,谢谢理解!
我们从上面学习中可以知道管道读写段一旦确定无法修改,我将在下篇博客中 将实现管道双向通信
结束
代码重在练习!
代码重在练习!
代码重在练习!
今天的分享就到此结束了,希望对你有所帮助,如果你喜欢我的分享,请点赞收藏夹关注,谢谢大家!!!
相关文章:
Linux管道 有名管道(FIFO)工作机制全解:从理论到实践
有名管道(重要) 有名管道/命名管道,主要用于没有血缘关系进程间的通信 当然也支持有血缘关系的情况,只是如果有血缘关系,没有必要使用有名管道,无名管道效果更佳 引入 好了,现在使用条件有了…...
java基础-修饰符
java修饰符 修饰符分类访问修饰符的作用域代码说明访问修饰符总览 非访问修饰符staticfinalabstractsynchronizedvolatiletransientnativestrictfp非访问修饰符总览表 非访问修饰符组合与冲突规则 修饰符分类 分类:访问修饰符 和 非访问修饰符 1.访问修饰符 公共…...
解锁基因密码之重测序(从测序到分析)
在生命科学的奇妙世界中,基因恰似一本记录着生命奥秘的“天书”,它承载着生物体生长、发育、衰老乃至疾病等一切生命现象的关键信息。而重测序技术,则是开启基因“天书”奥秘的一把神奇钥匙。 试想,你手中有一本经典书籍的通用版…...
当使用 Docker Desktop 启动 Tomcat 镜像时时间不对
当使用 Docker Desktop 启动 Tomcat 镜像时时间不对,可能由以下原因导致并可采取相应解决方法: 宿主机时间设置问题:Docker 容器的时间是由宿主机提供的,如果宿主机的时间不正确,那么容器的时间也会不正确。需确保宿主…...
golang gmp模型分析
思维导图: 1. 发展过程 思维导图: 在单机时代是没有多线程、多进程、协程这些概念的。早期的操作系统都是顺序执行 单进程的缺点有: 单一执行流程、计算机只能一个任务一个任务进行处理进程阻塞所带来的CPU时间的浪费 处于对CPU资源的利用&…...
Redisson的RedLock与联锁(MultiLock)的区别
Redisson提供了两种分布式锁机制:RedLock(红锁)和MultiLock(联锁),它们在实现分布式锁时有重要区别。 1. RedLock (红锁) 设计原理: 基于Redis官方提出的Redlock算法实现目的是在Redis集群环境下提供更可靠的分布式锁需要至少3个独立的Redi…...
图灵逆向——题十-魔改算法
目录列表 过程分析JS代码还原代码实现运行结果 本题属于魔改标准加密算法,所以无法使用JS或Python中的标准库来进行模拟加密了,只能一步一步的还原它的环境咯。。。 过程分析 打开控制台发现有个无限debugger,直接过掉~[doge]。。。 OK过掉…...
K8S学习之基础七十九:关闭istio功能
关闭istio功能 kubectl get ns --show-labels kubectl label ns default istio-injection-有istio-injectionenabled的命名空间,pod都会开启istio功能 反之,如果要开启istio,在对应命名空间打上该标签即可...
AI大模型课程系列汇总-某客时间篇
某客时间系列篇章💥 NO.文章(点击可跳转)1【课程系列11】某客时间AI 大模型应用开发实战营_ai大模型应用开发实战营 百度云-CSDN博客2【课程系列12】某客时间AI大模型微调训练营_极客时间 大模型rag 网盘-CSDN博客3【课程系列15】2024某客时…...
【人工智能】大语言模型多义词解析技术揭秘——以“项目“歧义消解为例
今天田辛老师和小伙伴探讨了一个有趣的多义词问题, 在人工智能技术日新月异的今天,大语言模型(LLM)对自然语言的理解能力已经达到令人惊叹的水平。大模型到底是如何去区分多义词的? 比如:当用户提到"…...
Coze平台 发布AI测试Agent的完整实现方案
以下是基于 Coze平台 发布AI测试Agent的完整实现方案,包含架构设计、核心功能模块、集成方式和落地步骤: 一、方案架构图 #mermaid-svg-kzS7cltxrbetjROl {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-kzS7cltxr…...
OpenHarmony子系统开发 - 调测工具(二)
OpenHarmony子系统开发 - 调测工具(二) 三、hiperf使用指导 hiperf是为开发人员提供性能采样分析的工具,基于内核perf机制进行的用户态能力的扩展,可以对指定的程序或者整个系统进行性能采样。 hiperf支持的命令有:l…...
keil ERROR: L6220E 如何解决
最近调试MK8000方案,增加code后遇到: keil ERROR: L6220E: Execution region RW_RAM1 size (24592 bytes) execeeds limit (24568 bytes) .region contains 93 bytes of padding and 0 bytes of veneers (total 93 bytes of linker generated content) …...
c++比较器——priority_queue用 ; unordered_map 自定义哈希函数
文章目录 priority_queue自定义比较方法对 比较对象结构体 重载 <仿函数为什么是传一个类std::less<T> 和 std::greater<T> lambda unordered_map自定义哈希函数仿函数lambda priority_queue template<class T,class Container std::vector<T>,class…...
centos-LLM-生物信息-BioGPT安装
参考: GitHub - microsoft/BioGPT https://github.com/microsoft/BioGPT BioGPT:用于生物医学文本生成和挖掘的生成式预训练转换器 |生物信息学简报 |牛津学术 — BioGPT: generative pre-trained transformer for biomedical text generation and mini…...
esp32cam远程图传:AI Thinker ESP32-CAM -》 服务器公网 | 服务器 -》 电脑显示
用AI Thinker ESP32-CAM板子访问公网ip的5112端口并上传你的摄像头拍摄的图像视频数据,并写一段python程序打开弹窗接受图像实现超远程图像传输教程免费 1. 首先你要有一个公网ip也就是去买一台拥有公网的服务器电脑,我买的是腾讯云1年38元的服务器还可…...
今日踩坑之@Autowired与@Resource区别
案例说明 今天算是体验到了这俩注解的区别了,真所谓不报错就记不住这两注解区别,其实之前本人也是知道这俩注解的区别的只是我们往往项目上用习惯了Autowired就忘了,看来只有真正体会到报错才能记忆犹新o(╥﹏╥)o。 说明一下本人的踩坑情况&…...
在 M1 芯片的 Mac 电脑上安装 Redis 可以通过 Homebrew 快速完成
以下是详细步骤: 1. 安装 Homebrew(若未安装) 打开 终端,执行以下命令安装 Homebrew(已安装可跳过): /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/…...
【从零开始学习JVM | 第一篇】快速认识JVM
什么是JVM? JVM--Java虚拟机,它是Java实现平台无关性的基石。 Java程序运行的时候,编译器将Java代码编译为平台无关的Java字节码文件(.class),接下来对应平台的JVM对字节码进行运行解释,翻译成…...
linux 里的创建了一个tomcat用户 怎么禁止该用户使用crontab 功能
在 Linux 系统中,可以通过以下方法禁止 tomcat 用户使用 crontab 功能: 方法 1:通过 /etc/cron.deny 文件限制 这是 最推荐的标准方法,适用于所有主流 Linux 发行版(CentOS、Ubuntu 等)。 操作步骤&#…...
Elasticsearch入门指南(二)
一、RestClient操作索引库 什么是RestClient? ES官方提供了各种不同语言的客户端,用来操作ES。这些客户端的本质就是组装DSL语句,通过http请求发送给ES。官方文档地址: https://www.elastic.co/guide/en/elasticsearch/client/in…...
Mac监控新风尚:酷炫界面,性能监控更直观!
你是否曾经希望自己的Mac能够像Windows那样,轻松一按就能查看任务管理器来监控性能状态呢? 对于Mac用户来说,系统性能监控一直是个挑战——苹果公司并没有提供一个直观的性能监控工具,用户往往需要通过复杂的活动监视器来获取这些…...
碰一碰发视频源码开发深度解析,定制化开发
在移动应用开发领域,便捷的数据分享功能始终备受关注。碰一碰发视频这一创新功能,借助近场通信(NFC)技术,为用户提供了一种快速、直观的视频分享体验。本文将深入剖析碰一碰发视频功能的源码开发过程,涵盖从…...
基于 AI智能体、大模型、RAG、Agent 等技术构建公司内部闭环智能问答系统的详细方案,结合 Spring Boot + Vue 管理系统 的改造思路
以下是基于 AI智能体、大模型、RAG、Agent 等技术构建公司内部闭环智能问答系统的详细方案,结合 Spring Boot Vue 管理系统 的改造思路: 1. 系统架构设计 核心组件 数据源层 内部文档库:公司知识库(如操作手册、FAQ、流程文档&a…...
红宝书第三十四讲:零基础学会单元测试框架:Jest、Mocha、QUnit
红宝书第三十四讲:零基础学会单元测试框架:Jest、Mocha、QUnit 资料取自《JavaScript高级程序设计(第5版)》。 查看总目录:红宝书学习大纲 一、单元测试是什么? 就像给代码做“体检”,帮你检查…...
视觉分析AI赋能智慧水务多场景应用
利用视觉分析的方式智慧水务的AI算法方案 一、背景 在传统水务监管中,面临着诸多痛点。例如,对于河道污染、水面异常、河湖四乱问题以及水生态环境差等情况,传统监管效率低下,预警不及时,资源分散,监控功…...
网络2 IP与MAC IP地址
IP地址与MAC地址 一 1.关系: 网卡有唯一的物理地址:MAC地址,IP是配置在网卡上的逻辑地址。 IP地址、MAC地址是进行网络通信必不可少的 2.MAC地址是物理地址,不可更改,通常与IP地址绑定 3.MAC地址:48位 IP地…...
spark-Core
运行架构 核心组件 由上图可以看出,对于 Spark 框架有两个核心组件: Driver,Spark 驱动器节点 其中Spark 驱动器节点,用于执行 Spark 任务中的 main 方法,负责实际代码的执行工作。 Driver 在 Spark 作业执行时主要…...
前端开发中的问题排查与定位:HTML、CSS、JavaScript(报错的解决方式)
目录 1.html 1. 结构错误调试:标签未正确嵌套 2. 语法问题调试:缺失引号 3. 断点调试:动态生成内容时的 JavaScript 错误 4. 网络调试:资源加载错误 5. 性能调试:页面加载性能 总结: 2.CSS 1. 定位…...
VMware Fusion Pro 13 for Mac虚拟机
VMware Fusion Pro 13 for Mac虚拟机 文章目录 VMware Fusion Pro 13 for Mac虚拟机一、介绍二、效果下载 一、介绍 VMware Fusion Pro for Mac,是一款mac虚拟机软件,跟Parallels Desktop一样,都可以让你的 Mac 同时运行一个或多个不同的操作…...
使用cline(VSCode插件)、continue(IDEA插件)、cherry-studio玩转MCP
安装环境 uv(python) 为什么不用pip? 使用 uv 时无需进行特定安装。使用 uvx 直接运行。 ⚡️ 比pip快10-100x https://github.com/pypa/pip https://ossinsight.io/analyze/pypa/pip?vsastral-sh%2Fuv#overview 安装 https://github…...
Kotlin FragmentTransaction多容器管理多个fragment
在Activity中管理五个Fragment的切换显示和隐藏,并且希望将这部分逻辑进行封装。之前已经教过他们如何在Kotlin中使用FragmentTransaction进行基本的添加、隐藏、显示和替换操作,现在需要进一步封装这些操作,提高代码的可维护性和复用性。 管…...
PyCharm显示主菜单和工具栏
显示主菜单 新版 PyCharm 是不显示主菜单的,要想显示主菜单和工具栏,则通过 “视图” → “外观” ,勾选 “在单独的工具栏中显示主菜单” 和 “工具栏” 即可。 设置工具栏 此时工具栏里并没有什么工具,因此我们需要自定义工具…...
WebView2最低支持.NET frame4.5,win7系统
WebView2最低支持.NET frame什么版本 WebView2 对 .NET Framework 的最低版本要求 基础支持范围 WebView2 官方支持的 .NET Framework 最低版本为 4.5,同时兼容 .NET Core 3.0 及以上版本18。对于 WPF、WinForms 等桌面应用开发,需确…...
ClickOnce 部署
1、在远程服务器172.16.9.252共享文件文件夹Bluetooth. 2、设置版本自动更新. 3、设置部署 4、设置创建桌面菜单 二、远程发布IIS即可...
Kotlin 中 集合 Collection 的扩展方法完全指南
Kotlin 中 Collection 的扩展方法完全指南 “代码是最美的诗篇”——本文将带你进入 Kotlin 集合扩展函数的世界,帮助你写出既高效又优雅的代码 🚀 一、引言 🤔 在 Android 开发中,集合(Collection)的操作…...
STM32F407使用ESP8266连接阿里云并上传数据
文章目录 前言一、ESP01S介绍1.ESP01S2.MQTT固件烧录3.WIFI连接 二、阿里云平台介绍1.创建产品及添加设备2.连接云平台 三、数据上报四、命令下发五、完整工程 前言 在实现OTA功能我们必须学会如何连接云平台,本文会仔细介绍使用STM32F407和ESP8266连接阿里云平台&…...
TorchServe部署模型-index_to_name.json
在TorchServe部署模型时,若要将模型输出结果映射到指定标签(如分类任务的类别名称),需通过index_to_name.json文件定义索引与标签的映射关系,并在打包模型时将其作为额外文件包含。以下是完整流程和命令示例࿱…...
每日一题——BMN3 小红炸砖块
“落下”操作只会对y轴有影响,所以注意y轴的变化即可 只要给出的坐标有砖块,就遍历查找他的上面是否有砖块,每一层都是这样,直到到没有砖块的那一层; 注意:定义矩阵时要注意,给出的坐标都是大…...
AWS服务器 磁盘空间升级到100G后,怎么使其生效?
在AWS(Amazon Web Services)上扩展EBS(Elastic Block Store)卷的大小后,服务器操作系统并不会自动识别新增的空间。要使操作系统识别并使用新增的磁盘空间,您需要进行一些额外的步骤。以下是详细的指导和说…...
AWS弹性容器服务(AWS Elastic Container Service,ECS)概述
李升伟 编译 标签:AWS | ECS | 容器 | Docker AWS弹性容器服务(AWS Elastic Container Service,ECS)简介 AWS弹性容器服务(ECS)是一项完全托管的容器编排服务,支持运行、管理和扩展容器化应用…...
【消息队列kafka_中间件】一、快速入门分布式消息队列
在当今大数据和分布式系统盛行的时代,消息队列作为一种关键的中间件技术,发挥着举足轻重的作用。其中,Apache Kafka 以其卓越的性能、高可扩展性和强大的功能,成为众多企业构建分布式应用的首选消息队列解决方案。本篇文章将带你深…...
【Axure元件分享】移动端滑动拨盘地区级联选择器
在移动端产品设计中,地区级联选择器(省/市/区)是用户信息录入场景的核心组件,尤其在电商收货地址、政务信息填报等高频业务中直接影响表单转化率。本文将介绍一款基于Axure的三级动态联动机型地区选择器,通过仿真级联滚…...
宁德时代25年校招演绎数字推理SHL测评题库题型及真题分析
非常感谢您对宁德时代的关注。祝贺您通过宁德时代校园招聘的专业面试环节,现邀请您参与完成以下测评。本轮共两份测评,每份测评对您的最终结果都非常重要,请务必在收到测评后48小时内完成!本测评需要进行远程监考,如果您无法或不愿…...
Python-Django+vue宠物服务管理系统功能说明
❥(^_-) 上千个精美定制模板,各类成品Java、Python、PHP、Android毕设项目,欢迎咨询。 ❥(^_-) 程序开发、技术解答、代码讲解、文档,💖文末获取源码+数据库+文档💖 💖软件下载 | 实战案例 💖文章底部二维码,可以联系获取软件下载链接,及项目演示视频。 本项目…...
洛谷普及B3691 [语言月赛202212] 狠狠地切割(Easy Version)
题目:[语言月赛202212] 狠狠地切割(Easy Version) 题号:B3691 难度:普及一 末尾包含对二分法优化的详细解释 题目分析 最后一句应该是本题的考查关键,关于筛选算法的时间优化, 但从功能理论上,我找到了…...
FPGA_BD Block Design学习(一)
PS端开发流程详细步骤 1.第一步:打开Vivado软件,创建或打开一个工程。 2.第二步:在Block Design中添加arm核心,并将其配置为IP核。 3.第三步:配置arm核心的外设信息,如DDR接口、时钟频率、UART接口等。 …...
Collection vs Collections:核心区别与面试指南
Collection vs Collections:核心区别与面试指南 一、本质区别(核心记忆点) 维度CollectionCollections身份集合框架的根接口操作集合的工具类包位置java.utiljava.util是否可实例化❌ 接口✅ 类(但构造器私有,不可实…...
sqlite3基本语句
创建表 CREATE TABLE student ( id INTEGER PRIMARY KEY, -- 学号,主键 name TEXT NOT NULL, -- 姓名,不能为空 age INTEGER, -- 年龄 gender TEXT -- 性别 ); SQLite常用数据类型 主键 …...
jupyter notebook 显示conda虚拟环境
使用 nb_conda_kernels 安装 nb_conda_kernels:这个包可以自动从你的 Conda 环境中发现并列出内核。 conda activate base # 确保你在 base 环境或任何其他环境中安装 conda install nb_conda_kernels显示jupyternotebook当前所在的位置。...