当前位置: 首页 > news >正文

【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. 命名管道的核心特性

  • 有固定文件名,存储在文件系统中(可用ls命令查看),但实际不存数据(数据在内存中)。
  • 通信时需“两端配合”:必须有一个进程写(open为写模式)、一个进程读(open为读模式),否则open会阻塞(等另一端准备好)。

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

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

(1)创建管道:mkfifo
  • 功能:在文件系统中创建一个FIFO文件,作为进程通信的“标识”。
  • 头文件:需包含 <sys/stat.h><sys/types.h>
  • 接口参数与返回值
    image.png
    • pathname:FIFO的文件名(比如"./myfifo"),进程通过这个路径找到管道。
    • mode:管道的权限(比如0664,表示所有者、组用户可读写,其他用户可读)。
    • 返回值:成功返回0,失败返回-1(比如文件已存在)。
(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

  • 客户端只需用open打开已存在的FIFO(写模式),直接write写入数据即可;写完后close,服务器会收到read返回0的信号(表示写端关闭)。

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

(1)open阻塞机制

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

  • 若进程以“读模式”打开管道(O_RDONLY),会阻塞到有进程以“写模式”打开。
  • 若进程以“写模式”打开管道(O_WRONLY),会阻塞到有进程以“读模式”打开。
    效果如下:
    image.png
    只有两端都打开管道,才能开始通信(写端写数据,读端立刻能读到)。
(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)
  • 构造函数:创建管道并打开(根据“读/写角色”决定open模式)。
    image.png
  • 析构函数:关闭文件描述符、删除管道(确保资源释放)。
    image.png
  • 管道名优化:用宏定义统一管道路径,避免硬编码(方便修改)。
    image.png
(2)封装Read/Write接口
  • 读接口:循环读取数据,自动处理\0(避免乱码)。
    image.png
  • 写接口:接收字符串,直接写入管道。
    image.png
(3)优化后Server与Client代码
  • 服务器端(只需创建Fifo对象,调用Read):
    image.png
  • 客户端(创建Fifo对象,调用Write):
    image.png

6. 命名管道扩展:实现文件拷贝

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

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

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

  • 未用宏时(代码冗余):
    image.png
  • 定义宏(\是C语言的“换行符续接”,让宏跨多行更易读):
    image.png
  • 用宏后(代码简洁,直接调用CHECK即可):
    image.png
http://www.dtcms.com/a/487760.html

相关文章:

  • 做网站时怎么裁切存图最佳建站模板
  • 020网站建设如何保护我做的网站模板
  • Escrcpy 安卓手机投屏软件中文绿色版
  • 大模型实习
  • 如何做网站旅游产品分析网站建设与数据库管理
  • dw不用代码做网站w3school网页制作
  • 网站备案号如何查询密码室内设计需要什么学历
  • Git 用户名与邮箱配置指南
  • Spring 中使用的设计模式
  • SAP MM采购订单审批接口分享
  • 东莞网站制作哪家公司好价格低用英语怎么说
  • SpringBoot萌宠社交分享系统的设计与实现hfdwz(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
  • 优秀画册设计网站电商加盟网站建设
  • 基于element-plus封装table组件
  • 长沙市网站建设公司网做影视网站需要境外
  • 全国响应式网站建设宜宾网站建设网站
  • 终极AI开发组合:Warp + Cursor + Claude Code 实战技巧分享
  • 响应式企业营销型网站多少钱企业策划书模板word
  • MetaShape(PhotoScan)——Camera calibration相机标定详解
  • 青岛好的网站制作推广wordpress速度确实差些
  • 网站seo步骤专业的传媒行业网站开发
  • 大模型-高频考点-每日一更【篇二】
  • 卡文迪许实验室:百年物理圣地的辉煌发展史
  • 服务器建设网站伪类网站
  • 网站建设论文模板小说网站建设目的
  • 模板建站有什么优势高大上网站设计
  • Windows Server 2012/2016 开启远程桌面
  • 网页设计课程主要内容网站关键词怎样优化
  • 深圳建设网站哪家强wordpress获取站点副标题
  • C#中的依赖注入