Linux--进程间的通信-命名管道

news/2025/6/19 18:25:26

前文:
Linux–进程间的通信-匿名管道
Linux–进程间的通信–进程池

命名管道的概念

命名管道是一种进程间通信(IPC)机制,运行不同进程之间进行可靠的、单向或双向的数据通信

特点和作用:

  1. 跨平台性:在WIndows和Linux系统中都有实现,因此具有良好的跨平台性。
  2. 简单易用: 使用命名管道进行通信相对简单。
  3. 安全性:命名管道充分利用了操作系统提供的安全特性,如WIndows的访问控制列表(ACL),从而确保通信的安全性。

命名管道的模拟实现

在这里插入图片描述
mkfifo是用于创建命名管道的命令,它的作用是在文件系统中创建一个特殊类型的文件,该文件可被多个进程用于进程间的通信。

在这里插入图片描述
这是mkfifo函数。

代码

Comm.hpp: 这里面包含了一个有关命名管道的类,包括管道的创建和销毁。

#ifndef __COMM_HPP__
#define __COMM_HPP__#include<iostream>
#include<string>
#include<cstring>
#include<cerrno>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<fcntl.h>using namespace std;#define Mode 0666
#define Path "./fifo"class fifo
{
public:fifo(const string & path):_path(path){umask(0);int n=mkfifo(_path.c_str(),Mode);if(n==0){cout<< "mkfifo success" << endl;}else{cerr << "mkfifo failed, errno: " << errno << ", errstring: " << strerror(errno) << endl;}}~fifo(){int n=unlink(_path.c_str());if (n == 0){cout << "remove fifo file " << _path << " success" << endl;}else{cerr << "remove failed, errno: " << errno << ", errstring: " << strerror(errno) << endl;}}
private:string _path; //文件路径
};#endif

PipeCilent.cc: 这是客户端(写端),将数据写入到命名管道文件;

#include"Comm.hpp"int main()
{int wfd=open(Path,O_WRONLY);if(wfd<0){cerr << "open failed, errno: " << errno << ", errstring: " << strerror(errno) << endl;return 1;}string inbuffer;while(true){cout<<"Please Enter Your Message# ";getline(cin,inbuffer);if(inbuffer=="quit") break;ssize_t n=write(wfd,inbuffer.c_str(),inbuffer.size());if(n<0){cerr << "write failed, errno: " << errno << ", errstring: " << strerror(errno) << endl;break;}}close(wfd);return 0;
}

PipeServer.cc: 服务端(读端),需要对管道创建一个对象,读取管道中的内容。

#include "Comm.hpp"
#include<unistd.h>int main()
{fifo ff(Path);int rfd=open(Path,O_RDONLY);if(rfd<0){cerr << "open failed, errno: " << errno << ", errstring: " << strerror(errno) << endl;return 1;}//如果写端没有打开,那么open函数会受到阻塞,相当于命名管道与写端没有通信,//open函数打开管道文件后如果没有连接写端就会等待cout<<"open success"<<endl;char buffer[1024];while(true){ssize_t n=read(rfd,buffer,sizeof(buffer)-1);if(n>0){buffer[n]=0;cout << "client say : " << buffer << endl;}else if(n==0){cout << "client quit, me too!!" << endl;break;}else{cerr << "read failed, errno: " << errno << ", errstring: " << strerror(errno) << endl;break;}}close(rfd);return 0;
}

解释

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

命名管道和匿名管道的区别:
匿名管道主要用于有血缘关系的进程间的通信,无法用于两个没有联系的进程而命名管道可以在文件系统中通过路径名来进行使用;并且命名管道开辟的管道本质是一个文件,相对于匿名管道,管道空间比较大;创建方式不同:通过调用不同的系统调用来进行创建;所在位置不同:匿名管道会在内存中创建,而命名管道会在文件系统中创建;


https://dhexx.cn/news/show-5318035.html

相关文章

单页面首屏优化,打包后大小减少64M,加载速度快了13.6秒

需求背景 从第三方采购的vue2 ElementUI实现的云管平台&#xff0c;乙方说2011年左右就开始有这个项目了&#xff08;那时候有Vue了吗&#xff0c;思考.jpg&#xff09;。十几年的项目&#xff0c;我何德何能可以担此责任。里面的代码经过多人多年迭代可以用惨不忍睹来形容&a…

基于监控视频的车辆检测

目前常用的基于监控视频的车辆检测方法分为两类&#xff1a;基于运动信息的车辆检测方法和基于特征信息的车辆检测方法。基于运动信息的车辆检测方法主要包括光流法、帧差法和背景法等。基于特征的车辆检测&#xff0c;是以统计机器学习理论为基础的车辆检测方法&#xff0c;通…

韩顺平 | 零基础快速学Python(12) OOP基础

面向对象编程-基础 类与对象 类提供了把数据和功能绑定在一起的方法。创建新类时创建了新的对象类型&#xff0c;从而能够创建该类型的新实例/对象。 类时抽象的概念&#xff0c;作为数据类型代表一类事物&#xff1b;对象时具体实际的&#xff0c;作为实例代表具体事物&…

第十六届“华中杯”大学生数学建模挑战赛B题思路

B题 使用行车轨迹估计交通信号灯周期问题 某电子地图服务商希望获取城市路网中所有交通信号灯的红绿周期,以便为司机提供更好的导航服务。由于许多信号灯未接入网络,无法直接从交通管理部门获取所有信号灯的数据,也不可能在所有路口安排人工读取信号灯周期信息。所以,该公…

【Linux系列】Ctrl + R 的使用

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【C 数据结构】静态链表

文章目录 【 1. 基本原理 】1.1 静态链表中的节点1.2 备用链表 【 2. 静态链表的创建 】2.1 实例1 - 创建静态链表&#xff0c;指定值2.2 实例2 - 创建静态链表&#xff0c;默认值 【 3. 静态链表 添加元素 】【 4. 静态链表 删除元素 】【 5. 静态链表 查找元素 】【 6. 静态链…

Linux的学习之路:5、粘滞位与vim

摘要 这里主要是把上章没说完的权限的粘滞位说一下&#xff0c;然后就是vim的一些操作。 目录 摘要 一、粘滞位 二、权限总结 三、vim的基本概念 四、vim的基本操作 五、vim正常模式命令集 1、插入模式 2、从插入模式切换为命令模式 3、移动光标 4、删除文字 5、复…

Storm详细配置

要详细配置 Apache Storm&#xff0c;你需要关注以下几个方面&#xff1a; Topology配置&#xff1a; ● 定义你的拓扑结构&#xff0c;包括哪些Spout和Bolt将被使用&#xff0c;它们之间的连接关系&#xff0c;以及拓扑如何处理数据流。 ● 设置每个组件的并行度&#xff0c…

【php快速上手(八)】

目录 PHP快速上手&#xff08;八&#xff09;PHP 数组1. 数组的定义2. 数组的操作3. 多维数组4. 数组遍历 PHP数组排序1. 排序索引数组2. 排序关联数组3. 自然排序4. 自定义排序 PHP快速上手&#xff08;八&#xff09; PHP 数组 在 PHP 中&#xff0c;数组是一种数据结构&am…

最大公约数和最小公倍数(C语言)

一、N-S流程图&#xff1b; 二、运行结果&#xff1b; 三、源代码&#xff1b; # define _CRT_SECURE_NO_WARNINGS # include <stdio.h>//实现最大公约数函数&#xff1b; int max(int x, int y) {//初始化变量值&#xff1b;int judge 1;//运算&#xff1b;judge x %…