Linux 命名管道

文章目录

  • 🚀 深入理解命名管道(FIFO)及其C++实现
    • 一、命名管道核心特性
      • 1.1 🧩 基本概念
    • 二、💻 代码实现解析
      • 2.1 📁 公共头文件(common.hpp)
      • 2.2 🖥️ 服务器端(server.cpp)
      • 2.3 📱 客户端(client.cpp)
    • 三、🔧 运行机制图解
    • 四、💡 技术亮点分析
      • 4.1 🚦 阻塞行为控制
      • 4.2 ⚡ 数据传输特性
      • 4.3 🐛 错误处理策略
    • 五、🚀 编译运行演示
      • 5.1 🔧 操作流程

在这里插入图片描述

🚀 深入理解命名管道(FIFO)及其C++实现


一、命名管道核心特性

1.1 🧩 基本概念

命名管道(FIFO)是一种特殊的文件类型,具有以下特点:

  • 跨进程通信:允许无亲缘关系进程通信 🌐
  • 文件系统可见:通过mkfifo创建实体文件 📂
  • 双工限制:需分别以读/写模式打开文件描述符 🔄
  • 阻塞特性:打开操作会阻塞直到另一端就绪 ⏳

二、💻 代码实现解析

2.1 📁 公共头文件(common.hpp)

#pragma once
#include <iostream>
#include <string>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <fcntl.h>#define FIFO_FILE "./myfifo"  // 🚪 管道文件路径
#define MODE 0664             // 🔒 权限模式enum {FIFO_CREATE_ERR = 1,     // 🛠️ 创建错误FIFO_DELETE_ERR = 2,     // 🗑️ 删除错误FIFO_OPEN_ERROR = 3      // 🔓 打开错误
};class Init {  // 🔄 RAII管理管道生命周期
public:Init() {int n = mkfifo(FIFO_FILE, MODE);if(n == -1) {perror("❌ mkfifo");exit(FIFO_CREATE_ERR);}}~Init() {int m = unlink(FIFO_FILE);if(m == -1) {perror("❌ unlink");exit(FIFO_DELETE_ERR);}}
};

2.2 🖥️ 服务器端(server.cpp)

#include "common.hpp"int main() {Init init;  // 🏗️ 自动创建管道int fd = open(FIFO_FILE, O_RDONLY);  // ⏸️ 阻塞直到客户端连接if(fd < 0) {perror(" open");exit(FIFO_OPEN_ERROR);}cout << " Server ready" << endl;while(true) {char buffer[1024];int bytes = read(fd, buffer, sizeof(buffer)-1);if(bytes > 0) {buffer[bytes] = '\0';cout << " Received: " << buffer << endl;} else if(bytes == 0) {cout << " Client disconnected" << endl;break;} else {perror(" read");break;}}close(fd);return 0;
}

2.3 📱 客户端(client.cpp)

#include "common.hpp"int main() {int fd = open(FIFO_FILE, O_WRONLY);  // 🔔 触发服务器唤醒if(fd < 0) {perror(" open");exit(FIFO_OPEN_ERROR);}cout << " Connected to server" << endl;string line;while(getline(cin, line)) {write(fd, line.c_str(), line.size());  // 📤 发送数据}close(fd);return 0;
}

三、🔧 运行机制图解

Server FIFO Client mkfifo() 🛠️ open(O_RDONLY) ⏳ open(O_WRONLY) 🔔 write() 📤 read() 📥 持续写入 转发数据 loop [🔁 通信循环] close() 🚪 检测EOF 👋 Server FIFO Client

四、💡 技术亮点分析

4.1 🚦 阻塞行为控制

// 服务器端 open() 阻塞示例
int fd = open(FIFO_FILE, O_RDONLY);  // ⏸️// 客户端 open() 解除阻塞
int fd = open(FIFO_FILE, O_WRONLY);  // ▶️

4.2 ⚡ 数据传输特性

特性描述图标
字节流传输无消息边界,需自定义协议🌊
原子性保证小于PIPE_BUF(通常4K)保证原子性⚛️
流量控制写满缓冲区后自动阻塞🚧

4.3 🐛 错误处理策略

if(write(fd, buf, len) == -1) {if(errno == EPIPE) {  // 💔 连接断开cout << " Connection closed" << endl;close(fd);exit(1);}perror(" write");
}

五、🚀 编译运行演示

5.1 🔧 操作流程

# 终端1:启动服务器
$ ./server
🔄 Server ready# 终端2:启动客户端
$ ./client
💬 Please Enter@ Hello World!# 终端1显示
📥 Received: Hello World!

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

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

相关文章

Python 与 sklearn 库:轻松构建 KNN 算法双版本

引言​ k 最近邻&#xff08;kNN&#xff09;算法是一种简单而强大的机器学习算法&#xff0c;常用于分类和回归任务。在 Python 中&#xff0c;借助 scikit - learn&#xff08;sklearn&#xff09;库&#xff0c;我们可以轻松实现 kNN 算法。本文将为大家介绍两种使用 sklea…

分享vue好用的pdf 工具实测

vue3-pdf-app&#xff1a; 带大纲&#xff0c;带分页&#xff0c;带缩放&#xff0c;带全屏&#xff0c;带打印&#xff0c;带下载&#xff0c;带旋转 下载依赖&#xff1a; yarn add vue3-pdf-appornpm install vue3-pdf-app 配置类&#xff1a; 创建文件 pdfConfig.ts /…

android 调用wps打开文档并感知保存事件

需求场景 在项目开发中会碰到需要调用WPS打开Word,Excel,Ppt等Office系列文档的情况&#xff0c;网上目前少有正式介绍如何调用相关API打开文档&#xff0c;并实现文档编辑后回传给三方应用&#xff0c;本人在逛WPS社区时发现 解锁WPS二次开发新世界&#xff1a;Android开发用…

HarmonyOS NEXT - 电商App实例三( 网络请求axios)

使用axios开发网络请求是一个非常常见的任务&#xff0c;尤其是Web前端开发者&#xff0c;对它非常熟悉。axios是一个基于Promise的HTTP客户端&#xff0c;支持浏览器和Node.js环境&#xff0c;使用简单且功能强大。 在harmonyOS中&#xff0c;如果想使用axios&#xff0c;可以…

19、TCP连接四次挥手的过程,为什么是四次?【高频】

四次挥手的过程 假设客户端主动发起。 第一次挥手&#xff1a;客户端向服务器 发送 FIN&#xff0c;表示 自己要断开数连接。随后&#xff0c;客户端 进入 FIN-WAIT-1 状态&#xff1b;服务器收到后&#xff0c;变为CLOSE_WAIT状态 第二次挥手&#xff1a;服务器 发送ACK 作为…

蓝桥云客 挖矿

0挖矿 - 蓝桥云课 问题描述 小蓝正在数轴上挖矿&#xff0c;数轴上一共有 n 个矿洞&#xff0c;第 i 个矿洞的坐标为 ai​。小蓝从 0 出发&#xff0c;每次可以向左或向右移动 1 的距离&#xff0c;当路过一个矿洞时&#xff0c;就会进行挖矿作业&#xff0c;获得 1 单位矿石&…

ssm:商业异常处理流程

第一步 定义全局R类制定标准 代码定义了一个通用的返回类 R<T>&#xff0c;用于封装API请求的结果&#xff0c;包括状态码、消息和数据。该类使用了Lombok的Data注解来减少样板代码&#xff08;如getter、setter方法等&#xff09;的编写。以下是代码的一些解释和建议&am…

Inficon IC5 沉积控制器 IC/5 型号

Inficon IC5 沉积控制器 IC/5 型号

农业建设项目管理系统评测:8款推荐工具优缺点分析

本文主要介绍了以下8款农业建设项目管理系统&#xff1a;1.PingCode&#xff1b; 2. Worktile &#xff1b;3. 建米农业工程项目管理系统&#xff1b;4. 开创云数字农业管理平台&#xff1b; 5. Trimble Ag Software&#xff1b;6.Conservis&#xff1b; 7. Agworld &#xff1…

大视频背景暗黑风格的wordpress企业主题免费下载

整体风格是黑色的&#xff0c;首页首屏大视频背景&#xff0c;动态效果非常好。向下滚动时&#xff0c;滚动的特效也不错。 原文 https://www.bixugao.com/wp/26.html

西门子S7-1200 PLC远程调试技术方案(巨控GRM532模块)

三步快速实现远程调试 硬件部署 准备西门子S7-1200 PLC、巨控GRM552YW-C模块及编程电脑。GRM552YW-C通过网口与PLC连接&#xff0c;支持4G/5G/Wi-Fi/有线网络接入&#xff0c;无需复杂布线。 软件配置 安装GVCOM3配置软件&#xff0c;注册模块&#xff08;输入唯一序列号与密…

系统思考:客户价值

“真正的市场竞争&#xff0c;不是比谁更能制造产品&#xff0c;而是比谁更能创造价值。” ——杰夫贝索斯 在组织辅导中&#xff0c;我经常问团队一个问题&#xff1a;“我们的客户是谁&#xff1f;”大多数人的第一反应是——“支付费用的就是客户。” 这在过去的市场扩张阶…

Centos7网卡 Failed to start LSB: Bring up/down networking

Centos7网卡 Failed to start LSB: Bring up/down networking 检查虚拟网络编辑器配置无误编辑ifcfg-ens33文件 Centos7重启网卡服务失败错误如下 给Centos7系统使用NAT模式配置静态IP地址&#xff1a; 检查虚拟网络编辑器配置无误 编辑ifcfg-ens33文件 vim /etc/sysconfig/ne…

第一个vue项目

项目目录 启动vue项目 npm run serve 1.vue.config.js文件 (CLI通过vue-cli-serve启动项目&#xff0c;解析配置配置文件vue-condig-js&#xff09; // vue.config.js //引入path板块&#xff0c;这是Node.js的一个内置模块&#xff0c;用于处理文件路径&#xff0c;这里引用…

【Qt】QWidget属性介绍

&#x1f3e0;个人主页&#xff1a;Yui_ &#x1f351;操作环境&#xff1a;Qt Creator &#x1f680;所属专栏&#xff1a;Qt 文章目录 前言1. enabled属性2.geometry属性2.1 改变控件位置2.2 女神表白程序2.3 知识补充——window frame 3. windowsTitle属性4. windowIcon属性…

嵌入式八股ARM篇

前言 ARM篇主要介绍一下寄存器和中断机制,至于汇编这一块…还请大家感兴趣自行学习 1.寄存器 R0 - R3 R4 - R11 寄存器 R0 - R3一般用作函数传参 R4 - R11用来保存程序运算的中间结果或函数的局部变量 在函数调用过程中 注意在发生异常的时候 cortex-M0架构会自动将R0-R3压入…

nerfstudio以及相关使用记录(长期更新)

NeRFStudio 是NeRF/3DGS研究和开发的集成平台。 提供了一个用户友好的界面和一系列工具&#xff0c;帮助研究人员和开发者更高效地构建、训练和评估 NeRF 模型。以前使用的时候用完就丢一边了&#xff0c;没有注意记录&#xff0c;现在有一个工程调用了nerfstudio&#xff0c;部…

《论分布式系统架构设计及其应用》架构师论文

【摘要】 2022年3月&#xff0c;我参与了某金融科技公司“智能风控云平台”项目的研发工作&#xff0c;担任系统架构师职务&#xff0c;负责分布式系统架构设计与核心技术选型。该平台旨在为银行、保险等金融机构提供实时风险评估、反欺诈及数据服务&#xff0c;需支撑每秒十万…

黄金还能再涨吗?

写在前面&#xff1a;【财富自由计算助手】已上线&#xff0c;快算算你的财富自由要多少 逻辑比事实更真实。 最近&#xff0c;黄金涨得妈都不认。 连菜市场大妈都在讨论&#xff0c;要不要囤点黄金。 2022 年初&#xff0c;俄乌冲突升级为全面战争以来&#xff0c;黄金价格…

AutoDev × MCP 双向赋能:AutoDev 即 MCP 服务,MCP 服务即 AutoDev 指令

在 Agentic Coding 这一话题下&#xff0c;工具使用&#xff08;Tool Use/Function calling&#xff09;是一个非常有意思的话题。完成一个软件开发任务&#xff0c;需要使用到大量的工具&#xff0c; 除去在 IDE 及其插件生态本身提供的功能外&#xff0c;还会使用到大量的外部…