Linux之命名管道简单模拟进程间通信

news2025/2/26 22:24:14

Linux之命名管道简单模拟进程间通信

在这里插入图片描述

文章目录

  • Linux之命名管道简单模拟进程间通信
  • 1.引言
  • 2.具体实现
    • 2.1服务端(Server.cc)
    • 2.2客户端(Client.cc)
  • 3.结果

1.引言

​ 首先,管道是一种半双工的单向进程间通信方式,也就是说它只能进行一边读一边写的过程,而不能进行同时性的读写。其次,管道的思想是让两个或者多个进程看到同一份资源,在公共资源上修改内容从而进行交互的过程。

​ 管道旗下分为两种具体管道: 1.匿名管道 2.命名管道,今天我们本篇就来介绍一下命名管道!

​ 若想了解匿名管道,可以回看我的Linux下匿名管道简单模拟进程间通信

​ 命名管道(Named Pipe)区别于匿名管道,无论进程有无血缘关系,命名管道可以解决任意进程之间的通信问题。由于带有名称,可以通过名称来来进行识别。使用mkfifo()函数来进行创建,通过write()和read()系统调用来读写数据。

在这里插入图片描述

知道了基本知识再结合我们之前的所学习的文件描述符fd的相关知识我们就可以来尝试着简单模拟一下进程间通信了!

2.具体实现

​ 我们本次实现命名管道模拟进程间通信采用服务端和客户端分开来实现,以便实现两者之间的通信。服务端负责创建管道与读取和输出数据。客户端负责写入与数据

2.1服务端(Server.cc)

​ 服务端我们主要分以下几步:

1.创建管道文件mkfifo

2.让服务端开启管道文件

3.正常通信(读取获取到的字符)

在服务端我们创建并打开管道文件后,开始读取管道的数据,并且输出读取到的数据。

​ 具体请看代码与注释:

int main()
{
    umask(0);  //默认掩码是0002,设置成000以便于管道文件的权限为666RWX
    //1.创建管道文件mkfifo
    int n = mkfifo("./fifo",0666); //在当前路径下创建fifo


    //2.让服务端开启管道文件
    int rfd = open("./fifo",O_RDONLY);
    
    //3. 正常通信
    char buffer[1024];//创建一个buffer来获取读到的数据。
    while(true)
    {
        buffer[0] = 0;
        ssize_t n = read(rfd,buffer,sizeof(buffer) - 1);
        if(n > 0) //读取成功
        {
            buffer[n] = 0; 
            std::cout<< "client# "<<buffer <<std::endl;
        }
        else if(n = 0)//结束
        {
            std::cout<<"Client quit ,I quit too..."<<std::endl;
            break;
        }
        else{//异常
            break;
        }
    }

    close(rfd);
    unlink("./fifo"); //unlink函数让fifo管道文件在每次执行文件运行完后都能自动释放,无需手动rm
    return 0;
}

2.2客户端(Client.cc)

我们客户端就只有一个任务,那就是往管道里写数据就完了,管道已经创建了就无需在客户端再创建了。

将每次写入的数据放到数组中再把整个数组写入管道就完事了。具体请看代码和注释。

int main()
{
    int wfd = open("./fifo",O_WRONLY);//任何读写操作都要先打开文件
    if(wfd < 0)//open失败判断,一般不会
    {
        std::cerr << errno << ":" << strerror(errno) <<std::endl;
        return 1;
    }

    char buffer[1024];//保存数据的数组
    while(true)
    {
        std::cout<<"Arthur# ";
        char *msg = fgets(buffer,sizeof(buffer),stdin);//将每次得到的数据写入到存放数据的数组中
        assert(msg);
        (void)msg;//强转一下void
       

        buffer[strlen(buffer) - 1] = 0; //尾部设置成0,防止fgets读取回车影响输出结果
        ssize_t n = write(wfd,buffer,strlen(buffer)); //写入数据
        assert(n >= 0);
        (void)n;
    }
    close(wfd);
    return 0;
}

3.结果

​ 在结果上如果我们分成两个桌面,能看到类似于QQ聊天一样,一个在输入,另一个能接收到并输出说明我们的设计就成功了。

我们运行两个可执行程序:

在这里插入图片描述

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

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

相关文章

【236. 二叉树的最近公共祖先】

目录 1.题目描述2.算法思路2.1算法思路12.2算法思路2 3.代码实现3.1代码实现13.2 代码实现2 1.题目描述 2.算法思路 2.1算法思路1 2.2算法思路2 思想很简单&#xff0c;但是最难的是怎么用栈来记录q、p的路线。所以下面才是关键。 3.代码实现 3.1代码实现1 class Solution…

Java训练五

一、跳动的心脏 心脏是动物的重要器官&#xff0c;不断跳动的心脏意味着鲜活的生命力。现在创建一个人类&#xff0c;把心脏类设计为人类里面的一个成员内部类。心脏类有一个跳动的方法&#xff0c;在一个人被创建时&#xff0c;心脏就开始不断地跳动。 package haha; publi…

「2024」预备研究生mem-相似三角形常规应用

一、相似三角形&常规应用 二、 课后习题

Vue2使用easyplayer

说一下easyplayer在vue2中的使用&#xff0c;vue3中没测试&#xff0c;估计应该差不多&#xff0c;大家可自行验证。 安装&#xff1a; pnpm i easydarwin/easyplayer 组件封装 习惯性将其封装为单独的组件 <template><div class"EasyPlayer"><e…

20230811在WIN11下使用python3批量将中英文的SRT格式的字幕合并

20230811在WIN11下使用python3批量将中英文的SRT格式的字幕合并 2023/8/11 8:35 缘起&#xff1a;将google翻译成为的简体中文字幕和剪影/RP2023直接通过语音OCR获取的SRT格式的英文字幕合并成为中英文的字幕&#xff01; 由于已经解决了UTF8的编码问题&#xff0c;ANSI/GBK编码…

Vue CLI 2.x搭建vue(目录最全分析)

一、vue-cli介绍 vue-cli是一个用于快速搭建vue项目的 脚手架。 二、vue-cli安装、更新 安装过nodeJs 、cnpm 后&#xff0c;全局安装vue-cli&#xff08;以后其他项目可直接使用&#xff09;&#xff1a; cnpm install -g vue-cli 查看安装成功否&#xff08;有版本号就是…

如何有效提高开发团队的开发效率?

提高生产力的实际因素之一是雇用为您的组织具有最高效率的开发人员。公司经理和人力资源管理最好雇用高效、有创造力和具有陡峭学习能力的员工。您将了解管理和领导力、战略规划、设定业务目标和建立工作满意度将如何提高组织中开发人员团队的生产力。 改进项目管理 提高团队…

mysql事务处理

一.抛出问题: 二. 事务: 1.本质:把多个操作,打包成一个操作完成. 2.原子性:多个操作,要么全部执行成功,要么一个都不执行(回滚). 3.回滚(rollback)机制:执行到中间出错了,自动把执行成功的操作还原到最初没有执行的样子. 实现回滚:把事务中每个执行的操作记录下来,如果要回…

还有人不知道这款网页版地理空间数据管理平台?赶紧来试试吧

四维轻云是一款网页版地理空间数据管理平台&#xff0c;用户能够在线管理、浏览及分享倾斜模型(.osgb)、激光点云(.las)、正射影像(dom)、数字高程模型(dem)等数据。目前&#xff0c;平台具有数据管理、场景编辑、空间测量、团队协作、加密分享、素材库等功能。 项目管理 四维…

13.1.1 翻转裁减,改变颜色,结合多种图像增广方法进行图像增广

一.图像增广的好处 随机改变训练样本可以减少模型对某些属性的依赖,从而提高模型的泛化能力。 裁剪图像可以减少模型对于对象出现位置的依赖 以不同的方式裁剪图像,使感兴趣的对象出现在不同的位置,减少模型对于对象出现位置的依赖 调整亮度、颜色等因素可以降低模型对颜色…

工业RFID识别技术,助力企业实现智能制造新高度!

RFID技术是一种无线通信技术&#xff0c;通过射频信号在读写器和射频标签之间进行数据交互&#xff0c;实现物体的自动识别和数据传输。随着科技的不断进步&#xff0c;RFID工业识别技术在智能制造领域扮演着越来越重要的角色。 RFID在智能制造中能解决什么问题&#xff1f; 物…

使用雅克比矩阵计算Lorenz的lyapunov exponent图谱

赋个初值看看: 我们使用雅克比矩阵计算lyapunov exponent图谱看看: matlab代码如下: clear; %% ===========初始化输入============== yinit = [0.1,0.1,0.1]; orthmatrix = [1 0 0;0 1 0;0 0 1];y = zeros(12,1); y(1:3) = yinit; y(4:12) = orthmatrix;mod = zeros(3,1…

c++QT文件操作

1 介绍 QT的文件操作来源于其抽象基类QIODevice&#xff0c;中用于处理输入输出设备。提供了统一的接口来处理不同类型的数据源&#xff0c;如文件、套接字、缓冲区等。QIODevice 主要用于读取和写入数据&#xff0c;无论数据来自何种源头&#xff0c;都可以通过 QIODevice 统一…

用 oneAPI 实现 AI 欺诈检测:一款智能图像识别工具

简介 虚假图像和视频日益成为社交媒体、新闻报道以及在线内容中的一大隐患。在这个信息爆炸的时代&#xff0c;如何准确地识别和应对这些虚假内容已经成为一个迫切的问题。为了帮助用户更好地辨别虚假内容&#xff0c;我开发了一款基于 oneAPI、TensorFlow 和 Neural Compress…

一文了解新能源电机国内主流供应商

作为新能源汽车核心三电系统之一的“电机”就好比燃油车的发动机一样&#xff0c;是车辆核心部件&#xff0c;但似乎消费者没太大关注这方面。今天我们给大家聊聊这个核心部件&#xff01; 一辆新能源汽车占生产成本最高的部件是动力电池&#xff0c;约占到30%左右&#xff0c…

ppt怎么压缩?试试这样压缩文件

当PPT文件体积过大时&#xff0c;打开的速度就会很慢&#xff0c;演示的时候刘程度也会受到影响&#xff0c;其次&#xff0c;现在很多平台对于上传的文件是有大小限制的&#xff0c;比如超过100M的文件就无法上传、发送等等&#xff0c;那么&#xff0c;怎么才能压缩PPT文件呢…

手撕HashMap源码

auth&#xff1a;虎 &#xff0c;2023年5月8日—???完。 前言&#xff1a; 最初在面试的时候&#xff0c;在个人栏第一条写了一句话“手撕HashMap”源码作为亮点&#xff0c;以下是曾经的学习笔记&#xff0c;目前来说不是很完整&#xff0c;有机会下次面试时候再补全吧~ 1…

python numpy数组水平和垂直合并

1 水平Horizontal合并 Horizontal:水平向右拉长 利用np.hstack()&#xff1a;原始数据size可以不一致 利用np.concatenate()&#xff1a;原始数据size可以不一致 import numpy as np # 三个一维数组 array1 np.array([1, 2, 3]) array2 np.array([4, 5, 6]) array3 np.ar…

Koan自动重装和Cobbler_web

Koan是Cobbler的辅助工具&#xff0c;可以实现很多功能&#xff0c;使用koan配合Cobbler可以实现快速重装Linux系统&#xff1a; 1、安装koan&#xff1a; yum install -y epel-releaseyum install -y koan 安装截图&#xff1a; 2、在客户机上&#xff0c;用koan选择要重装的…

【Fegin技术专题】「原生态」打开Fegin之RPC技术的开端,你会使用原生态的Fegin吗?(高级用法)

对于Httpclient请求机制进行设置操作处理。 Body注解申明一个请求体模板&#xff0c;模板中可以带有参数&#xff0c;与方法中Param注解申明的参数相匹配,使用方法如下: interface LoginClient {void login( String user, String password); } ...client.login("denomin…