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

进程间通信,Linux命名管道的前世今生

1.1、创建及简单使用

命令管道的创建依赖于函数mkfifo,函数原型如下

在这里插入图片描述

代码语言:javascript

AI代码解释

#include <sys/types.h> #include <sys/stat.h> int mkfifo(const char *pathname, mode_t mode);

关于mkfifo函数

在这里插入图片描述

  • 对于参数1,既可以传递绝对路径/home/xxx/namePipeCode/fifo,也可以传递相对路径./fifo,当然绝对路径更灵活,但也更长
  • 对于参数2,mode_t其实就是对unsigned int的封装,等价于uint32_t,而mode就是创建命名管道时的初始权限,实际权限需要经过umask掩码计算

不难发现,mkfifomkdir非常像,其实mkfifo可以直接在命令行中运行

创建一个名为fifo的命名管道文件

代码语言:javascript

AI代码解释

mkfifo fifo

在这里插入图片描述

p是管道文件,大小为0

在这里插入图片描述

这个管道文件也非常特殊:大小为0,从侧面说明 管道文件就是一个纯纯的内存级文件,有自己的上限,出现在文件系统中,只是单纯挂个名而已

可以直接在命令行中使用命名管道:

  • echo可以进行数据写入,可以重定向至fifo
  • cat可以进行数据读取,同样也可以重定向于fifo

打开两个终端窗口(两个进程),即可进行通信

在这里插入图片描述

命名管道遵循管道的四种场景,因此在写端未写入数据时,读端会阻塞当然也可以通过程序实现两个独立进程IPC

思路:创建服务端 server客户端 client两个独立的进程,服务端server创建并以的方式打开管道文件,客户端client的方式打开管道文件,打开后俩进程可以进程通信,通信结束后,由客户端关闭写端(服务端读端读取到 0 后也关闭并删除命令管道文件

注意:

  • 当管道文件不存在时,文件会打开失败,因此为了确保正常通信,需要先运行服务端server创建管道文件
  • 服务端启动后,因为是读端,所以会阻塞等待客户端(写端)写入数据
  • 客户端写入数据时,因为 ‘\n’ 也被读取了,所以要去除此字符
  • 通信结束后,需要服务端主动删除管道文件

代码语言:javascript

AI代码解释

unlink 命令管道文件名 //删除管道文件

为了让服务端和客户端能享有同一个文件名,可以创建一个公共头文件 common.h,其中存储命名管道文件名及默认权限等公有信息

公共资源common.h

代码语言:javascript

AI代码解释

#pragma once #include <iostream> #include <string> std::string fifo_name = "./fifo"; //管道名 uint32_t mode = 0666; //权限

服务端(写端) server.cc 提供文件拷贝服务

代码语言:javascript

AI代码解释

#include <iostream> #include <cstring> #include <cerrno> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include "common.h" using namespace std; int main() { // 服务端 // 1、打开文件 int wfd = open(fifo_name.c_str(), O_WRONLY); if (wfd < 0) { cerr << "open fail! errno: " << errno << " | " << strerror(errno) << endl; exit(0); } // 2、打开源文件 FILE *fp = fopen("file.txt", "r"); if (fp == NULL) { cerr << "fopen fail! errno: " << errno << " | " << strerror(errno) << endl; exit(0); } // 3、读取源文件数据 char buff[1024]; int n = fread(buff, sizeof(char), sizeof(buff), fp); //IPC区域 // 4、写入源文件至命名管道 write(wfd, buff, strlen(buff)); cout << "服务端已向管道写入: " << n << "字节的数据" << endl; //IPC区域 fclose(fp); fp = nullptr; close(wfd); return 0; }

客户端(读端) client.cc 从服务端中拷贝文件(下载)

代码语言:javascript

AI代码解释

#include <iostream> #include <cstring> #include <cerrno> #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include "common.h" using namespace std; int main() { // 客户端 // 1、创建命名管道文件 int ret = mkfifo(fifo_name.c_str(), mode); if (ret < 0) { cerr << "mkfifo fail! errno: " << errno << " | " << strerror(errno) << endl; exit(0


http://www.jsqmd.com/news/505821/

相关文章:

  • 共创力与某机器人公司就CBB管理进行探讨
  • GitHub汉化插件:让GitHub界面秒变中文的完整指南
  • 基于Matlab开发的整车动力系统匹配计算软件:一键匹配输出性能要求,底层代码同时公开
  • LangGraph入门实战:用“把大象装进冰箱”理解Multi-Agent,保姆级代码解析,建议收藏
  • Apache SeaTunnel 2.3.8集群部署避坑指南:Master与Worker节点配置详解
  • 思源宋体专业应用指南:从技术架构到场景落地的系统化解构
  • Cosmos-Reason1-7B对比分析:与Claude在代码生成任务上的效果评测
  • Verilog 加法器设计:从基础单元到性能优化
  • RocketMQ磁盘爆满?三步搞定CODE 14报错(附详细日志清理指南)
  • PAT 乙级 1065
  • 别再混淆CRU和FRU了!一文读懂华为SmartKit工具在维保服务中的关键角色
  • AHT10温湿度传感器驱动开发与I²C嵌入式实践
  • 从PN结到开关信号:NPN与PNP三极管实战解析笔记
  • 梦行云软件——溯源系统-》企业方员工》员工录入台》扫溯源码,设置码专属信息
  • STM32+Helix解码MP3实战:从SD卡读取到DAC输出的完整流程(附避坑指南)
  • 飞书原生“龙虾“来了,用户一下点击即可拥有专属 Agent
  • Cosmos-Reason1-7B效果展示:复杂室内场景中人员行为与空间关系推理
  • 基于springboot勐库非遗藤条茶展示平台设计与开发(源码+精品论文+答辩PPT等资料)
  • 51单片机IIC协议实战:从零开始驱动OLED显示自定义图案
  • PyTorch训练时内存爆炸?5个实用技巧帮你稳住GPU显存
  • 在终端执行以下命令,将编译生成的程序、动态库和共享资源全部打包
  • CLCD土地覆盖数据在ArcGIS中的实战应用:从导入到空间分析的完整指南
  • C++11、C++14、C++17、C++20新特性解析(一)
  • 32款“Claw系”国产AI神器全收录 + 官方下载链接,收藏这一篇就够了!
  • 2026年成都GEO外包公司实力盘点:选对伙伴才能抓住流量 - 红客云(官方)
  • 怎样快速上手UndertaleModTool:5个专业技巧打造个性化游戏体验 [特殊字符]
  • 所有agent都听一个人指挥,这个设计本身就有问题
  • 数字IC设计全流程解析:从规格到布局的关键EDA工具指南
  • 5分钟搞定Nacos Docker集群部署:含Standalone模式快速验证技巧
  • PAT 乙级 1070