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;
}
三、🔧 运行机制图解
四、💡 技术亮点分析
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!
相关文章:
Linux 命名管道
文章目录 🚀 深入理解命名管道(FIFO)及其C实现一、命名管道核心特性1.1 🧩 基本概念 二、💻 代码实现解析2.1 📁 公共头文件(common.hpp)2.2 🖥️ 服务器端(s…...
HDU 学数数导致的
题目解析 首先,数对是有序的,<1,2>和<2,1>被视为不同的两组数字。 其次,数对<p,q>的p和q可以相等。 子序列为 p 0 p q,观察到,中间要出现一个0。那么,我们只需要找到第一个 p 满足与前…...
pjsip pjsua_media_config 结构体说明
clock_rate 描述:设置会议桥(conference bridge)的时钟频率(采样率)。 默认值:0(使用默认值 PJSUA_DEFAULT_CLOCK_RATE,通常为 16kHz)。 作用:影响音频的采样率,常见值有 8000(8kHz)、16000(16kHz)、48000(48kHz)等。snd_clock_rate 描述:设置音频设备的时钟…...
软件/硬件I2C读写MPU6050
MPU6050简介 6轴:3轴加速度,3轴角速度 9轴:3轴加速度,3轴角速度和3轴磁场强度 10轴:3轴加速度,3轴角速度和3轴磁场强度和一个气压强度 加速度计具有静态稳定性,不具有动态稳定性 欧拉角&…...
c++ union使用笔记
c union使用笔记 一、联合的简单使用二、联合与枚举结合三、匿名联合(Anonymous Union)四、关键注意事项五、C17 扩展:std::variant C联合(union)是一种特殊的数据结构,允许在相同内存位置存储不同的数据类…...
Android中的Wifi框架系列
Android wifi框架图 Android WIFI系统引入了wpa_supplicant,它的整个WIFI系统以wpa_supplicant为核心来定义上层接口和下层驱动接口。 Android WIFI主要分为六大层,分别是WiFi Settings层,Wifi Framework层,Wifi JNI 层ÿ…...
react(一):特点-基本使用-JSX语法
初识React React是一个用于构建用户界面的 JavaScript 库,由 Facebook 开发和维护。 官网文档:React 官方中文文档 特点 1.声明式编程 2.组件化开发 3.多平台适配 开发依赖 开发React必须依赖三个库: 1.react:包含react所必…...
【Go】无法访问 proxy.golang.org 进行依赖下载
golang.org/x/net/context: golang.org/x/netv0.37.0: Get "https://proxy.golang.org/golang.org/x/net/v/v0.37.0.zip": dial tcp 142.251.215.241:443: connect: connection refused解决方案: 使用国内的 Go 代理,如 goproxy.cn 或 gopro…...
鸿蒙 @ohos.arkui.observer (无感监听)
鸿蒙 ohos.arkui.observer (无感监听) 在鸿蒙开发中,ohos.arkui.observer 模块提供了一种强大的无感监听机制,允许开发者监听组件的状态变化、滚动事件、页面切换等事件。这些功能对于实现复杂的交互逻辑和优化性能非常有帮助。本文将详细介绍 ohos.ark…...
一键爬取b站视频
同学们。废话不多说, b站视频素材多, 二次加工就归你, 三话不说爬起来, 犯法违纪咱不干 代码 import json import requests from bs4 import BeautifulSoup import re# 目标网址bvnane"BV1hUQEYCEyY" pp("0&q…...
【含文档+PPT+源码】基于Python的图书管理系统的设计与实现
项目介绍 本课程演示的是一款基于Python的图书管理系统的设计与实现,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 包含:项目源码、项目文档、数据库脚本、软件工具等所有资料 带你从零开始部署运行本套系统 该项目附…...
开源工具利器:Mermaid助力知识图谱可视化与分享
在现代 web 开发中,可视化工具对于展示流程、结构和数据关系至关重要。Mermaid 是一款强大的 JavaScript 工具,它使用基于 Markdown 的语法来呈现可定制的图表、图表和可视化。对于展示流程、结构和数据关系至关重要。通过简单的文本描述,你可…...
Mysql的utf8mb4_general_ci 与 utf8mb4_bin 的具体区别是什么?中文适合哪个?
1. utf8mb4_general_ci vs utf8mb4_bin 的具体区别 utf8mb4_general_ci 和 utf8mb4_bin 都是 utf8mb4 编码的排序规则(collation),它们主要在 排序(ORDER BY) 和 比较(WHERE) 时的行为不同&…...
茂捷M1001电感式编码器芯片TSSOP28管脚,国产电感式编码器IC
简述: M1001 电感式编码器芯片是一款专为高精度位置检测而设计的芯片产品,采用先进的电感技术,能够精确测量旋转物体的位置和角度。芯片具有 SIN/COS、模拟、PWM、SENT、SPI、I2C等多种角度输出功能,具有高分辨率、宽工作温度范围…...
LeetCode-跳跃游戏 II
方法一:反向查找出发位置 我们的目标是到达数组的最后一个位置,因此我们可以考虑最后一步跳跃前所在的位置,该位置通过跳跃能够到达最后一个位置。 如果有多个位置通过跳跃都能够到达最后一个位置,那么我们应该如何进行选择呢&a…...
【后端】【django】Django DRF `@action` 详解:自定义 ViewSet 方法
Django DRF action 详解:自定义 ViewSet 方法 在 Django REST Framework(DRF)中,action 装饰器用于为 ViewSet 添加自定义的 API 端点。相比于 update、create 等默认方法,action 允许我们定义 更加清晰、语义化 的 A…...
数据结构——双向链表dlist
前言:大家好😍,本文主要介绍了数据结构——双向链表dlist 一 双向链表定义 1. 双向链表的节点结构 二 双向链表操作 2.1 定义 2.2 初始化 2.3 插入 2.3.1 头插 2.3.2 尾插 2.3.3 按位置插 2.4 删除 2.4.1 头删 2.4.2 尾删 2.4.3 按…...
IDEA 一键完成:打包 + 推送 + 部署docker镜像
1、本方案要解决场景? 想直接通过本地 IDEA 将最新的代码部署到远程服务器上。 2、本方案适用于什么样的项目? 项目是一个 Spring Boot 的 Java 项目。项目用 maven 进行管理。项目的运行基于 docker 容器(即项目将被打成 docker image&am…...
图像分类数据集
《动手学深度学习》-3.5-学习笔记 # 通过ToTensor实例将图像数据从PIL类型变换成32位浮点数格式, # 并除以255使得所有像素的数值均在0~1之间 trans transforms.ToTensor()#用于将图像数据从 PIL 图像格式(Python Imaging Libraryÿ…...
设计模式之美
UML建模 统一建模语言(UML)是用来设计软件的可视化建模语言。它的语言特点是简单 统一 图形化 能表达软件设计中的动态与静态信息。 UML的分类 动态结构图: 类图 对象图 组件图 部署图 动态行为图: 状态图 活动图 时序图 协作…...
2025-03-15 学习记录--C/C++-PTA 练习3-4 统计字符
合抱之木,生于毫末;九层之台,起于累土;千里之行,始于足下。💪🏻 一、题目描述 ⭐️ 练习3-4 统计字符 本题要求编写程序,输入10个字符,统计其中英文字母、空格或回车、…...
802.11标准
系列文章目录 文章目录 系列文章目录一、相关知识二、使用步骤1.802.11修正比较2.802.11ac 三、杂记 一、相关知识 跳频扩频:射频信号可分为窄带信号和扩频信号。如果射频信号的带宽大于承载数据所需的带宽,该信号就属于扩频信号。跳频扩频(FHSS)是一种…...
母婴商城系统Springboot设计与实现
项目概述 《母婴商城系统Springboot》是一款基于Springboot框架开发的母婴类电商平台,旨在为母婴产品提供高效、便捷的在线购物体验。该系统功能全面,涵盖用户管理、商品分类、商品信息、商品资讯等核心模块,适合母婴电商企业或个人开发者快…...
C#通过API接口返回流式响应内容---分块编码方式
1、背景 上一篇文章《C#通过API接口返回流式响应内容—SSE方式》阐述了通过SSE(Server Send Event)方式,由服务器端推送数据到浏览器。本篇是通过分块编码的方式实现 2、效果 3、具体代码 3.1 API端实现 [HttpGet] public async Task Chu…...
游戏引擎学习第158天
回顾和今天的计划 我们在这里会实时编码一个完整的游戏,没有使用引擎或库,一切都由我们自己做所有的编程工作,游戏中的每一部分,无论需要做什么,我们都亲自实现,并展示如何完成这些任务。今天,…...
如何在电脑上使用 Jupyter Notebook 通过 SSH 远程连接树莓派Zero
有无数种方式通过SSH远程连接树莓派,但对于树莓派Zero 2W这种硬件资源有限的板子,因为内存有限Pycharm干脆不能通过SSH连接树莓派Zero 2W。VScode通过SSH连接时,也会因为资源有限时常断线。因此,我们就要用轻量级的编辑器Jupyter …...
[新能源]新能源汽车快充与慢充说明
接口示意图 慢充接口为交流充电口(七孔),快充接口为直流充电口(九孔)。 引脚说明 上图给的是充电口的引脚图,充电枪的为镜像的。 慢充接口引脚说明 快充接口引脚说明 充电流程 慢充示意图 慢充&…...
《解锁华为黑科技:MindSpore+鸿蒙深度集成奥秘》
在数字化浪潮汹涌澎湃的当下,人工智能与操作系统的融合已成为推动科技发展的核心驱动力。华为作为科技领域的先锋,其AI开发框架MindSpore与鸿蒙系统的深度集成备受瞩目,开启了智能生态的新篇章。 华为MindSpore:AI框架的创新先锋…...
HCIA-ACL
一、基本概念 1、概念:ACL即访问控制列表,是一种基于包过滤的访问控制技术。由一条或多条规则组成的集合,通过定义动作来确保哪些数据包可以通过,哪些需要被阻止。 2、基本原理:ACL 通过规则对数据包分类,…...
深入解析 React 最新特性:革新、应用与最佳实践
深入解析 React 最新特性:革新、应用与最佳实践 1. 引言 React 作为前端开发的核心技术之一,近年来不断推出 新的 API 和优化机制,从 Concurrent Rendering(并发模式) 到 Server Components(服务器组件&a…...
