进程间通信之利用命名管道进行通信

文章目录

  • 什么是命名管道
  • 命名管道的作用有什么
  • 命名管道的特点和用法是什么
  • 命名管道与匿名管道有什么区别
    • 匿名管道相较于命名管道的局限性
  • 命名管道如何使用
  • 代码

什么是命名管道

命名管道(Named Pipe),也被称为FIFO(First In, First Out),是一种在Unix和Unix-like操作系统中用于进程间通信的特殊文件类型。它允许不相关的进程通过文件系统中的路径名进行通信。

命名管道的作用有什么

命名管道(Named Pipe)是一种在Unix和Unix-like系统中用于进程间通信的特殊文件类型。它的作用主要体现在以下几个方面:

进程间通信: 命名管道提供了一种进程间通信的方式。不同的进程可以通过共享同一个命名管道文件进行通信,其中一个进程将数据写入管道,而另一个进程从管道中读取数据。这样,进程之间可以实现数据的交换和共享。

无关进程通信: 与匿名管道不同,命名管道可以用于无关的进程之间通信。因为命名管道在文件系统中有一个路径名,进程可以通过路径名来打开和访问它,而不需要共享相同的地址空间或具有亲缘关系。

独立于进程生命周期: 命名管道是持久的,它存在于文件系统中,不受创建它的进程的生命周期限制。这意味着即使创建命名管道的进程结束,其他进程仍然可以使用相同的管道进行通信。

阻塞式通信: 命名管道是阻塞的,即写入端会等待读取端准备好接收数据,反之亦然。这样可以协调进程之间的通信,确保数据的正确传输。

常用于Shell编程: 在Shell编程中,命名管道常用于将一个命令的输出传递给另一个命令,实现管道传输的同时也可以用于进程间通信。

总体而言,命名管道提供了一种方便、灵活且持久的进程间通信机制,适用于各种需要数据交换的场景。

命名管道的特点和用法是什么

文件系统中的路径名: 命名管道在文件系统中有一个路径名,类似于普通文件。进程可以通过打开这个路径名的方式来访问命名管道。

独立的进程通信: 不同进程可以通过共享同一个命名管道文件来进行通信。这使得命名管道成为不同进程之间进行进程间通信的有效手段。

创建和删除: 命名管道可以使用 mkfifo 函数来创建。创建后,它就成为文件系统中的一个特殊文件。当通信结束时,可以使用 unlink 函数删除命名管道。

读写操作: 进程可以像普通文件一样使用文件描述符对命名管道进行读取和写入操作,实现进程间的数据传输

命名管道与匿名管道有什么区别

命名管道(Named Pipe)和匿名管道(Anonymous Pipe)是两种不同类型的管道,它们在创建、使用和生命周期等方面有一些关键区别。

命名管道:

创建: 命名管道在文件系统中有一个路径名,可以通过 mkfifo 函数创建。它是一个具有持久性的文件,不依赖于创建它的进程的生命周期。
路径名: 命名管道有一个在文件系统中的路径名,因此可以被不同的进程通过路径名来访问。
无关进程通信: 不相关的进程可以通过共享同一个路径名的命名管道进行通信。
使用: 通过文件描述符进行读写操作,可以使用标准的文件I/O函数。
生命周期: 命名管道存在于文件系统中,直到显式删除。
匿名管道:

创建: 匿名管道是由 pipe 系统调用创建的,没有在文件系统中的路径名。它是一种临时的、仅存在于相关进程之间的通信机制。
路径名: 不存在路径名,只能在创建它的进程及其相关子进程之间使用。
有关进程通信: 主要用于有关系(亲缘关系)的父子进程之间通信。
使用: 通过文件描述符进行读写操作,可以使用标准的文件I/O函数。
生命周期: 随着创建它的进程或相关子进程的终止而结束。
综上所述,主要区别在于命名管道是具有路径名的、持久的文件,可以被不相关的进程使用;而匿名管道是临时的、只存在于相关进程之间的通信机制,主要用于父子进程之间通信。选择使用哪种管道取决于具体的应用场景和需求。

匿名管道相较于命名管道的局限性

首先我们可以先看一下匿名管道的代码

#include <iostream>
#include <string>
#include <unistd.h>
#include <string.h>
#include <string>
#include <cstdio>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
using namespace std;
#define N 2
const int NUM = 1024;
void Write(int n)
{string s = "hello,I am chile";pid_t self = getpid();char buffer[NUM]; // 缓冲区int number = 0;while (true){buffer[0] = 0; // 字符串清空snprintf(buffer, sizeof(buffer), "%s-%d-%d", s.c_str(), self, number++);// cout << buffer << endl;write(n, buffer, strlen(buffer));sleep(1);}
}
void Read(int rfd)
{char buffer[NUM];while (true){buffer[0] = 0;ssize_t n = read(rfd, buffer, sizeof(buffer));if (n > 0){buffer[n] = 0;cout << "father get a message[" << getpid() << "]# " << buffer << endl;}}
}int main()
{int pipefd[N] = {0};int n = pipe(pipefd);if (n < 0)return 1;pid_t id = fork();if (id < 0)return 2;if (id == 0){close(pipefd[0]);Write(pipefd[1]);close(pipefd[1]);exit(0);}close(pipefd[1]);Read(pipefd[0]);pid_t rid = waitpid(id, NULL, 0);if (rid < 0){return 3;}close(pipefd[0]);return 0;
}

从上面代码我们可以清晰的感知到匿名管道只适用与具有亲缘关系的进程之间的通信但是我们在实际开发环境中更多的进程是不具备亲缘关系的因此匿名管道就非常的局限了。我们看一下匿名管道的最终实现的效果图
在这里插入图片描述

命名管道如何使用

我们来看一下命名管道的使用效果图
在这里插入图片描述
在这张图我们可以清楚的看到右边输入左边输出达到了我们想要的无亲缘关系的进程的通信

代码

1.comm.hpp文件

#pragma once#include <iostream>
#include <string>
#include <cerrno>
#include <cstring>
#include <cstdlib>
#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,FIFO_OPEN_ERR
};class Init
{
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);}}
};
  1. server.cpp文件代码
#include "comm.hpp"
#include <iostream>
using namespace std;
int main()
{Init init;int fd = open(FIFO_FILE, O_RDONLY);if (fd < 0){exit(FIFO_OPEN_ERR);}while (true){char buffer[1024];int len = read(fd, buffer, sizeof(buffer));if (len < 0){break;}else if (len > 0){buffer[len] = 0;cout << "client say#" << buffer << endl;}else if (len == 0){break;}}close(fd);return 0;
}
  1. client.cpp的代码
#include "comm.hpp"
#include <iostream>
using namespace std;
int main()
{int fd = open(FIFO_FILE, O_WRONLY);if (fd == -1){perror("open");exit(FIFO_OPEN_ERR);}else{cout << "client open file done" << endl;while (1){cout << "Please Enter@ ";string a;getline(cin, a);write(fd, a.c_str(), a.size());}}close(fd);return 0;
}

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

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

相关文章

宝藏排序1

题目 冒泡排序 import java.util.Arrays; import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt();sc.nextLine();int[] res new int[n];for(int i0;i<n;i)res[i] sc.nextInt()…

C语言——整数和浮点数在内存中的存储

目录 一、整数在内存中的存储 二、大小端字节序和字节序判断 2.1 什么是大小端&#xff1f; 2.2 为什么有大小端? 2.3 练习 2.3.1 练习1 2.3.2 练习2 三、浮点数在内存中的存储 3.1练习 3.2 浮点数的存储 3.2.1浮点数存的过程 3.2.2浮点数取的过程 3.3 题目解…

provide和inject快速上手

应用案例 代码 点击弹窗1按钮&#xff0c;弹窗2出现 父组件 provide注入数据 // 弹窗1<Event ></Event> // 弹窗2<EventEvaluation v-if"isShowEventEvaluation"></EventEvaluation>const isShowEventEvaluation falseconst isShowEvent…

数学建模-预测人口数据

目录 中国09~18年人口数据 创建时间 绘制时间序列图 使用专家建模器 得到结果 预测结果 残差的白噪声检验 中国09~18年人口数据 创建时间 路径&#xff1a;数据-> 定义日期和时间 绘制时间序列图 使用专家建模器 看看spss最终判断是那个模型最佳的契合 得到结果 预…

【2024最新-python3小白零基础入门】No4.python控制语句学习

文章目录 1 选择结构1.1 if语句 2 循环结构2.1 while循环语句2.2 for循环语句2.3 break、continue、pass在循环中的用途 对于 Python 程序中的执行语句,默认是按照书写顺序依次执行的,这时称这样的语句是顺序结构的。但是,仅有顺序结构还是不够的,因为有时需要根据特定的情况,有…

vite多页面打包学习(一)

一、前期准备 首先初始化两套独立的vue实例和相关生态&#xff08;多页面嘛&#xff09;&#xff0c;如下 我在src文件下创建了pages大文件夹&#xff0c;并初始化了两套页面分别为index和page1&#xff0c;每套页面都有自己单独的组件、路由、状态、入口等等&#xff0c;这里…

SpringMVC实现原理及详解

1、什么是 SpringMVC ? 在介绍什么是 SpringMVC 之前&#xff0c;我们先看看 Spring 的基本架构。如下图&#xff1a; 我们可以看到&#xff0c;在 Spring 的基本架构中&#xff0c;红色圈起来的 Spring Web MVC &#xff0c;也就是本系列的主角 SpringMVC&#xff0c;它是属于…

被忽视的暗面:客户端应用漏洞挖掘之旅

被忽视的暗面&#xff1a;客户端应用漏洞挖掘之旅 前言 在2023年12月15日&#xff0c;我有幸参加了由“字节跳动安全中心”举办的“安全范儿”沙龙活动。作为“中孚信息元亨实验室”的一员&#xff0c;我被邀请分享名为“被忽视的暗面&#xff1a;客户端应用漏洞挖掘之旅”的…

unocss+iconify技术在vue项目中使用20000+的图标

安装依赖 npm i unocss iconify/json配置依赖 vue.config.js文件 uno.config.js文件 main.js文件 使用 <i class"i-fa:user"></i> <i class"i-fa:key"></i>class名是 i- 开头&#xff0c;跟库名:图标名&#xff0c;那都有什么库…

mysql函数group_concat()返回结果不全

目录 一、场景二、原因三、排查1、查看group_concat_max_len配置2、修改group_concat_max_len配置a) 如果不方便重启mysql&#xff0c;可以通过以下命令进行配置修改b) 修改mysql配置文件&#xff0c;永久生效 一、场景 mysql使用group_concat()函数拼接返回字段时&#xff0c…

《游戏-01_2D-开发》

首先利用安装好的Unity Hub创建一个unity 2D&#xff08;URP渲染管线&#xff09;项目 选择个人喜欢的操作格局&#xff08;这里采用2 by 3&#xff09; 在Project项目管理中将双栏改为单栏模式&#xff08;个人喜好&#xff09; 找到首选项&#xff08;Preferences&#xff09…

Docker(二)安装指南:主要介绍 Docker 在 Linux 、Windows 10 和 macOS 上的安装

作者主页&#xff1a; 正函数的个人主页 文章收录专栏&#xff1a; Docker 欢迎大家点赞 &#x1f44d; 收藏 ⭐ 加关注哦&#xff01; 安装 Docker Docker 分为 stable test 和 nightly 三个更新频道。 官方网站上有各种环境下的 安装指南&#xff0c;这里主要介绍 Docker 在…

CentOS 7安装 NVIDIA 独立显卡驱动(禁用nouveau)

1.禁用nouveau 安装nvidia显卡驱动首先需要禁用nouveau&#xff0c;不然会碰到冲突的问题&#xff0c;导致无法安装nvidia显卡驱动。 禁用步骤 1.使用su命令切换到root用户下: su root查看nouveau是否禁用 lsmod | grep nouveau如果像这样输出一堆信息&#xff0c;则表示没…

allegro画PCB如何倒板框圆弧角

对板框进行倒圆角:Manufacture-Drafting-Fillet 对板框进行倒圆角:Manufacture-Drafting-Fillet 上图中的25对应的就是弧度半径&#xff0c;默认单位是mil&#xff0c;也可以设置成mm 最后点击相邻的边框线就可以倒成圆弧角了。 效果如下图&#xff1a;

SD卡出现乱码文件怎么修复?

SD卡出现乱码文件的问题是用户在使用过程中经常会遇到的故障。这些乱码文件的出现&#xff0c;可能是由于多种原因引起的&#xff0c;例如文件系统损坏、病毒攻击、设备兼容性问题等。本文将深入分析SD卡出现乱码文件的背后原因&#xff0c;并提供相应的解决方案&#xff0c;帮…

Python数据分析案例36——基于神经网络的AQI多步预测(空气质量预测)

案例背景 不知道大家发现了没&#xff0c;现在的神经网络做时间序列的预测都是单步预测&#xff0c;即(需要使用X的t-n期到X的t-1期的数据去预测X的t期的数据)&#xff0c;这种预测只能预测一个点&#xff0c;我需要预测X的t1期的数据就没办法了&#xff0c;有的同学说可以把预…

C++设计模式(李建忠)笔记4(完结)

C设计模式&#xff08;李建忠&#xff09; 本文是学习笔记&#xff0c;如有侵权&#xff0c;请联系删除。 参考链接 Youtube: C设计模式 Gtihub源码与PPT&#xff1a;https://github.com/ZachL1/Bilibili-plus 豆瓣: 设计模式–可复用面向对象软件的基础 总结23种设计模式…

5-数组-矩阵置零

这是数组的第5篇算法&#xff0c;力扣链接。 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0…

VMware 安装 CentOS7

目录 镜像下载VMware创建创建新的虚拟机直接自定义了选择镜像所在位置更改虚拟机的名称和存储位置&#xff08;尽量不要使用默认位置&#xff09;设置虚拟机的配置&#xff08;根据自己的情况而定&#xff09;设置虚拟机的内存&#xff08;根据自己情况而定&#xff09;设置网络…

浅谈2023-2024年中国人工智能计算力发展

2023年是人工智能发展的重要转折年&#xff0c;企业正加速从业务数字化迈向业务智能化。大模型和生成式人工智能的发展将引发计算范式之变、产业动量之变&#xff0c;以及算力服务格局之变。从感知智能到生成式智能&#xff0c;人工智能算力需求快速增长。大模型和生成式人工智…