【Linux】Linux进程间通信:命名管道(FIFO)的模拟实现重要知识点梳理 - 实践

news/2025/11/13 17:04:20/文章来源:https://www.cnblogs.com/slgkaifa/p/19218788

【Linux】Linux进程间通信:命名管道(FIFO)的模拟实现重要知识点梳理 - 实践

前言:欢迎各位光临本博客,这里小编带你直接手撕**,文章并不复杂,愿诸君**耐其心性,忘却杂尘,道有所长!!!!

在这里插入图片描述


IF’Maxue:个人主页

个人专栏:
《C语言》
《C++深度学习》
《Linux》
《数据结构》
《数学建模》

⛺️生活是默默的坚持,毅力是永久的享受。不破不立!

文章目录

    • 一、命名管道(FIFO):跨进程通信的“桥梁”
      • 1. 命名管道的核心特性
      • 2. 命名管道的核心接口(代码级)
        • (1)创建管道:mkfifo
        • (2)删除管道:unlink
      • 3. 命名管道实战:Server与Client通信
        • (1)服务器端(server.cc):读数据
        • (2)客户端(client.cc):写数据
      • 4. 通信关键机制与问题解决
        • (1)`open`阻塞机制
        • (2)写端关闭的处理
        • (3)常见Bug:信息打印乱码
      • 5. 命名管道优化:封装成类(C++)
        • (1)封装头文件(Fifo.hpp)
        • (2)封装Read/Write接口
        • (3)优化后Server与Client代码
      • 6. 命名管道扩展:完成文件拷贝
        • (4)宏定义优化:简化错误处理

一、命名管道(FIFO):跨进程通信的“桥梁”

命名管道(FIFO)是Linux中一种简单的进程间通信方式,核心优势是能让无血缘关系的进程(比如两个独立的程序)互相传递数据,就像搭建了一条专用“数据管道”。

1. 命名管道的核心特性

2. 命名管道的核心接口(代码级)

操作FIFO主要依赖3个核心接口:mkfifo(创建管道)、open/close/read/write(读写数据)、unlink(删除管道)。

(1)创建管道:mkfifo
(2)删除管道:unlink
  • 功能:删除FIFO文件,释放管道占用的资源(避免文件残留)。
  • 接口参数与返回值
    image.png
    • pathname:要删除的FIFO文件名(和mkfifo的路径一致)。
    • 返回值:成功返回0,失败返回-1(比如文件不存在)。

3. 命名管道实战:Server与Client通信

FIFO通信需要两个独立程序:server.cc(读数据)和client.cc(写数据),必须同时运行才能通信。

(1)服务器端(server.cc):读数据

核心逻辑:创建管道 → 打开管道(读模式) → 读取数据 → 关闭管道 → 删除管道。
代码细节如下:

  • 创建管道:先判断mkfifo是否成功,失败则报错(比如管道已存在)。
    image.png
  • 删除管道:一般在程序结束前调用unlink,确保资源释放(即使程序异常退出,也建议在后续处理中删除)。
    image.png
  • 打开、读取、关闭管道:用open打开管道(读模式),read循环读取数据,close关闭文件描述符。
    image.png
    • 注意:open为读模式时,会阻塞等待,直到有客户端以写模式打开管道,才会返回。
(2)客户端(client.cc):写资料

核心逻辑:打开管道(写模式) → 写入数据 → 关闭管道(无需创建/删除管道,由服务器负责)。
代码细节如下:
image.png

4. 通信关键机制与问题解决

(1)open阻塞机制

FIFO的open有个“等待特性”:

(2)写端关闭的处理

当客户端(写端)close后,服务器(读端)的read会返回0(表示“无更多数据”)。此时需要在服务器代码中判断,避免无限循环读0。
修改前(无提示,读端会一直循环):
image.png
修改后(判断read返回0,提示“写端关闭”并退出):
image.png

(3)常见Bug:信息打印乱码

若直接用printf("%s", buf)打印读取的buf,可能出现乱码——因为read读取的是“二进制数据”,不一定以\0结尾(C语言中%s需要\0标识字符串结束)。
Bug效果:
image.png
解决方法:手动给buf\0(注意预留\0的位置,比如buf大小1024,最多读1023字节)。
修改代码:
image.png
修改后效果(无乱码):
image.png

5. 命名管道优化:封装成类(C++)

为了简化代码、避免重复操作(比如每次都写mkfifoopenclose),可以用C++类封装FIFO的操作,核心思路是:

  • 构造函数:创建管道、打开档案描述符。
  • 析构函数:关闭文件描述符、删除管道。
  • 提供ReadWrite成员函数,供外部调用。
(1)封装头文件(Fifo.hpp)
(2)封装Read/Write接口
  • 读接口:循环读取数据,自动处理\0(避免乱码)。
    image.png
  • 写接口:接收字符串,直接写入管道。
    image.png
(3)优化后Server与Client代码

6. 命名管道扩展:实现资料拷贝

利用FIFO的通信能力,可以达成“客户端传材料、服务器存文件”的能力。核心逻辑是:

  • 客户端:打开要拷贝的文件 → 读取材料内容 → 写入FIFO。
  • 服务器:从FIFO读取内容 → 写入新资料。
    代码示例(服务器端核心逻辑):
    image.png
(4)宏定义优化:简化错误处理

频繁判断“函数返回值是否为-1”会让代码冗余,可定义宏来封装“错误打印+进程退出”的逻辑。

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

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

相关文章

同行已用软件许可优化省下百万,你还在犹豫什么?

不行,我真的不开心了。我是某科技公司SRE团队的王磊,刚被问到四个季度资产管理效率比的情况。上面那位,别拿日常工作当借口,软件资产管理早就不是儿戏了!听我说,您要是还在想"明年再说"?晚了!看看我…

为什么需要学习Numpy

为什么需要学习Numpy Numpy是什么 NumPy(Numerical Python 的简称)是 Python 中用于科学计算的核心库之一。它提供了一个强大的 多维数组对象(ndarray),以及一系列用于高效处理这些数组的数学函数。NumPy 是许多数…

格尔木户外立式广告机零售报价,含价格对比与折扣详情

近年来,户外立式广告机市场在多重因素影响下呈现出显著的价格波动。以2024年第四季度至2025年第三季度的数据为例,整机平均价格区间波动幅度约为12%,其中核心部件如工业级液晶面板、高亮LED背光模组及防尘防水结构件…

2025年阳台式太阳能热水系统制造企业权威推荐榜单:壁挂式太阳能/阳台壁挂式太阳能/阳台壁挂式太阳能热水器源头厂家精选

在城市建筑向立体化发展的今天,阳台式太阳能热水系统凭借其空间适应性强、安装便捷的特点,正成为绿色建筑能源解决方案的重要组成部分。 随着城市住宅密度不断增加和居民节能意识提升,阳台式太阳能热水系统市场需求…

PCBA方案设计——充气泵方案设计

充气泵主要使用在汽车车胎打气上面,通过马达的运转来工作。马达运转抽气时,连通器的阀门被大气的气压冲开,气体进入气筒,而向轮胎中打气时,阀门又被气筒内的气压关闭,气体就进入了轮胎中。今天我们就来聊一下关于…

开发随笔2-C++对象序列化和反序列化框架

View Post开发随笔2-C++对象序列化和反序列化框架在 开发随笔1 - 现代C++对象工厂模式实现 基础之上,我们可以开发一个基于模块工厂的序列化框架。这里采用boost中的property_tree来作为序列化输出和反序列化输入。序…

2025年稀土合金直销厂家权威推荐榜单:钢水净化剂/碳钢精炼剂/铸钢精炼剂源头厂家精选

在钢铁工业持续向高质量、低能耗方向发展的背景下,稀土合金凭借其在提升钢水纯净度、改善钢材性能方面的独特优势,正成为冶炼环节不可或缺的添加剂。 稀土合金作为一种由稀土元素与贱金属组合而成的金属材料,能赋予…

C++构造和折构函数详解,超详细! - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Akamai 简单 记录

Akamai 简单 记录2025.11.13找到 sensor_data 的地方``` var TK7 = rB[kY()[mq(S9)].call(null, lg, KG, WF)][kY()[mq(tr)](RC(RC([])), Ax, pO)](RK7); `````` 向上搜索 RK7 RK7 = rB[kY()[mq(S9)].apply(null,…

2025年海南景区标识标牌设计公司权威推荐榜单:海口标识标牌制作/标识标牌制作/安全标识标牌设计源头公司精选

在海南自贸港建设与旅游业升级的双重推动下,景区标识标牌作为游客体验的重要载体,其专业设计与制作正成为景区建设的关键环节。 随着海南旅游市场持续回暖,景区配套设施升级需求显著增长。据行业统计数据显示,2025…

251112D. 谜题(poem)

251112D. 谜题(poem) 给定长为 \(n\) 的排列 \(a\)。有 \(k\) 次交换,每次在所有的 \(\binom n2\) 对数中随机一对交换。问最终逆序对数的期望。 但是这样还不够!有 \(q\) 次修改,将第 \(i\) 次交换改为交换给出的…

可白嫖源码---45125构建个性化智能实习匹配与综合管理平台的研究与构建(案例分析)-附源码

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

同行都在降本,你还在浪费?3招软件许可优化快速追赶!

我是Tom,一线做IT运维已经10年了,看到身边不少同行在软件许可这件事上吃亏,今天我就把我在“许可优化”这条坑上踩过的常识,毫无保留地分享出来,希望能帮到钱没少烧但还在原地踏步的你。 先说说我每次去帮人做系统…

【CSS】background-size 属性详解

【CSS】background-size 属性详解【CSS】background-size 属性详解原创【CSS】background-size 属性详解-CSDN博客于 2024-09-23 11:30:52 发布1.8w 阅读 32 33CC 4.0 BY-SA版权文章标签:#css#前端#node.js#javascrip…

Redis分布式锁:从“能用”到“好用”,中间差了多少细节?

redis分布式锁安全吗? 1、为什么需要分布式锁与分布式锁对应的是【单机锁】,在写多线程时,避免同时操作一个共享变量产生数据问题,通常会使用一把锁来【互斥】,以确保共享变量的正确性,使用范围是在同一个进程中…

为什么你的JavaScript代码总是出bug?这5个隐藏陷阱太坑了!

🧑‍💻 写在开头 点赞 + 收藏 === 学会🤣🤣🤣你是不是经常遇到这样的情况:明明代码看起来没问题,一运行就各种报错?或者测试时好好的,上线后用户反馈bug不断?更气人的是,有时候改了一个小问题,结果引…

[电调]AM32电调调参系列 —— Complementary PWM参数的作用与分析

[电调]AM32电调调参系列 —— Complementary PWM参数的作用与分析https://blog.csdn.net/qq_39312146/article/details/153827884在AM32固件中,​​Complementary PWM(互补PWM)​​ 的选择对电调的性能、效率和发热…

Zabbix监控mysl数据库配置

用mysql自带的模板,可以监控如下内容:OPS(增删改查)、mysql请求流量带宽,mysql响应流量带宽,最后会附上相应的监控图! 一、编写脚本 check_mysql.sh vi /usr/local/zabbix/share/check_mysql.sh !/bin/bash ---…

Java 线程同步与线程间通信

Java 线程同步与线程间通信 线程同步概述 核心问题:竞争状态与线程安全 当多个线程同时访问共享资源(临界资源)时,可能导致资源数据被破坏,这种现象称为竞争状态。若一个类的对象在多线程环境中不会引发竞争状态,…