Linux通信--构建进程通信的 方案之管道(下)|使用匿名管道实现功能解耦|命名管道实现serveclient通信

news2025/1/12 16:14:12

文章目录

一、管道的应用实例-父进程唤醒子进程,子进程执行某种任务

二、命名管道

1.创建一个命名管道

2.匿名管道与命名管道的区别

3.命名管道的打开规则

4.用命名管道实现server&client通信



一、匿名管道的应用实例-父进程唤醒子进程,子进程执行某种任务

后续将源码上传到gitee,上传后修改链接。

二、命名管道

  • 管道应用的一个限制就是只能具有共同祖先的进程进行通信
  • 如果想让不相关的进程交换数据,可以使用FIFO文件来做,它被称为命名管道
  • 命名管道是一种特殊的文件

1.创建一个命名管道

创建命令:mkfifo filename

创建函数: int mkfifo(const char * filename,mode_t mode);

参数:管道的名字,创建的管道权限

2.匿名管道与命名管道的区别

  • 匿名管道由pipe函数创建并打开
  • 命名管道由mkfifo函数创建,打开用open
  • FIFO(命名管道)与pipe(匿名管道)之间的区别在于,他们创建与打开的方式不同,这些工作完成后,他们有相同的语义。

3.命名管道的打开规则

  • 如果是只读方式打开FIFO
  • O_NONBLOCK disable:阻塞直到有相应进程为写而打开FIFO
  • O_NONBLOCK enable:立刻返回成功
  • 如果是只写方式打开FIFO
  • O_NONBLOCK disable:阻塞直到有相应进程为读而打开FIFO
  • O_NONBLOCK enable:立刻返回失败,错误码为ENXIO

4.用命名管道实现server&client通信

实例功能:

1创建管道

2 创建的命名管道可以让两个进程通信

3. 进程A 向管道中写入 进程B从管道中读取并打印到标准输出

需求分析:首先需要创建两个进程,client端和server端,还需要一个common文件来声明共同的定义和方法,所以创建三个文件client.cc,server.cc,common.hpp。接下来逐个文件分析

1.首先,创建管道,只需要创建一次即可,本次案例在server.cc中创建,client.cc中使用即可

common.hpp
#pragma once 
#include<iostream>
#include<string>
#define NUM 1024
const std::string fifoname = "./fifo";
uint32_t mode = 0666;


server.cc

umask = 0; //这个设置不影响系统的umask,只影响此进程的
int n = mkfifo(fifoname.c_str(),mode);

至此管道已经创建

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

int rfd = open(fifoname.c_str(),O_RDONLY);
//打开失败
if(rfd < 0)
{
    std::cout<<errno<<endl;
    return 2;
}

//打开成功
    ....

3.client端不需要创建文件,只用写方式打开文件就可以

// int open(const char * pathname ,int oflag, ...) 
//成功则返回文件描述符,失败-1


int wfd = open(filename.c_str(),O_WRONLY);
if(wfd <0)
{
    //写方式打开失败
    return 1;
}


4.两端开始通信

server端:
 
char buffer[1024];
while(true)
{
    buffer[0] = 0;

    //read(int fd , void * buf, size_t count) fd是文件描述符,用于要定位读取的文件或者其他设备,buf为缓冲区地址,count是要读取的字节数,读成功返回实际读取的字节数,返回复数读取失败,返回0读取到文件末尾
    
    //从rfd文件中读取x个字节到buffer中
    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, me too" <<std::endl;
        break;
    }

    else
    {
        std::cout<<errno<<std::endl;
        break;
     }
}

client端:

    char buffer[NUM];
    while(true)
    {
        std::cout<<"please enter your message : ";
        char * msg = fgets(buffer,sizeof(buffer)-1,stdin);
        assert(msg);
        (void)msg;
        
        //处理发送消息的回车,最后一个字符删掉
        buffer[strlen(buffer)-1] = o;
        ssize_t n = write(wfd,buffer,strlen(buffer));
        assert(n>= 0);
        (void)n;
    }

    
    

5.两端通信结束,关闭对应的文件描述符

close(wfd);

close(rfd);


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

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

相关文章

Verilog开源项目——百兆以太网交换机(一)架构设计与Feature定义

Verilog开源项目——百兆以太网交换机&#xff08;一&#xff09;架构设计与Feature定义 &#x1f508;声明&#xff1a;未经作者允许&#xff0c;禁止转载 &#x1f603;博主主页&#xff1a;王_嘻嘻的CSDN主页 &#x1f511;全新原创以太网交换机项目&#xff0c;Blog内容将聚…

vue使用命令npm install 报错 cb() never called!

一.错误说明,npm本身下载就慢&#xff0c;有可能是网络的问题。 二.解决方案,把npm设置成淘宝镜像后,再重新npm install npm config set registry https://registry.npm.taobao.org 三.还是不行&#xff0c;还会出现同样的问题&#xff0c;那接下来先清理一下npm缓存 npm cache…

微信网站应用申请

网站应用是基于微信开放平台的。它的特点是&#xff1a; 1、用户可使用微信帐号快速登录你的网站&#xff0c;降低注册门槛&#xff0c;提高用户留存 2、同一用户使用微信登录你的不同应用和公众帐号&#xff0c;会对应同一个UnionID&#xff0c;以便进行不同业务间的帐号统一…

【力扣每日一题】2023.8.28 插入区间

目录 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 代码&#xff1a; 题目&#xff1a; 示例&#xff1a; 分析&#xff1a; 和昨天的题大差不差&#xff0c;我们仍然是有一堆区间&#xff0c;题目给我们一个新的区间&#xff0c;要我们把新区间插入到原本的区间数…

ES 7.6 - API高阶操作篇

ES 7.6 - API高阶操作篇 分片和副本索引别名添加别名查询所有别名删除别名使用别名代替索引操作代替插入代替查询 场景实操 滚动索引索引模板创建索引模板查看模板删除模板 场景实操一把索引的生命周期数据迁移APIGEO(地理)API索引准备矩形查询圆形查询多边形查询 自定义分词器…

范式 事务 多表查询

范式 概念&#xff1a;设计数据库时&#xff0c;需要遵循的一些规范。要遵循后边的范式要求&#xff0c;必须遵循前边的所有范式要求 第一范式&#xff1a; 数据库表的每一列都是不可分割的基本数据项 这样子就不满足第一范式 这样子就满足第一范式 存在问题&#xff1a; 数…

【真题解析】系统集成项目管理工程师 2022 年下半年真题卷(案例分析)

本文为系统集成项目管理工程师考试(软考) 2022 年下半年真题&#xff08;全国卷&#xff09;&#xff0c;包含答案与详细解析。考试共分为两科&#xff0c;成绩均 ≥45 即可通过考试&#xff1a; 综合知识&#xff08;选择题 75 道&#xff0c;75分&#xff09;案例分析&#x…

搭建微服务架构、实现服务调用

OpenFeign&#xff1a;Spring Cloud声明式服务调用组件 OpenFeign 全称 Spring Cloud OpenFeign&#xff0c;它是 Spring 官方推出的一种声明式服务调用与负载均衡组件&#xff0c;它的出现就是为了替代进入停更维护状态的 Feign。 OpenFeign 常用注解 使用 OpenFegin 进行远…

Java中线程共享变量的可见性问题

在Java中&#xff0c;线程是一种重要的并发编程机制。线程允许程序同时执行多个任务&#xff0c;提高了程序的效率和性能。然而&#xff0c;线程的并发执行也带来了一些问题&#xff0c;其中之一就是线程共享变量的可见性问题。 什么是线程共享变量的可见性问题呢&#xff1f;…

Confluence使用教程(用户篇)

1、如何创建空间 可以把空间理解成一个gitlab仓库&#xff0c;空间之间相互独立&#xff0c;一般建议按照部门&#xff08;小组的人太少&#xff0c;没必要创建空间&#xff09;或者按照项目分别创建空间 2、confluence可以创建两种类型的文档&#xff1a;页面和博文 从内容上来…

Linux通过libudev获取挂载路径、监控U盘热拔插事件、U盘文件系统类型

文章目录 获取挂载路径监控U盘热拔插事件libusb 文件系统类型通过挂载点获取挂载路径添libudev加库 获取挂载路径 #include <stdio.h> #include <libudev.h> #include <string.h>int main() {struct udev *udev;struct udev_enumerate *enumerate;struct ud…

C++--动态规划背包问题(1)

1. 【模板】01背包_牛客题霸_牛客网 你有一个背包&#xff0c;最多能容纳的体积是V。 现在有n个物品&#xff0c;第i个物品的体积为vivi​ ,价值为wiwi​。 &#xff08;1&#xff09;求这个背包至多能装多大价值的物品&#xff1f; &#xff08;2&#xff09;若背包恰好装满&a…

AMD即将上市大量中端显卡,为新显卡支付过高价格的日子可能结束

​AMD在本周末&#xff08;8月25日&#xff09;的德国Gamescom活动中展示了两款新显卡和一些新的升级技术&#xff0c;这些新GPU的定价将与英伟达的GeForce RTX 4000卡竞争。 这是一件大事&#xff0c;因为新的Radeon RX 7700 XT和7800 XT卡占据了AMD Radeon RX 7000系列产品线…

nlp系列(7)三元组识别(Bert+CRF)pytorch

模型介绍 在实体识别中&#xff1a;使用了Bert模型&#xff0c;CRF模型 在关系识别中&#xff1a;使用了Bert模型的输出与实体掩码&#xff0c;进行一系列变化&#xff0c;得到关系 Bert模型介绍可以查看这篇文章&#xff1a;nlp系列&#xff08;2&#xff09;文本分类&…

springboot实现 伪微信登录

众所周知&#xff0c;微信扫码登陆的功能&#xff0c;个人网站是无法申请的&#xff0c;我们想在本地想测一下微信登录也是无法实现。 要实现微信登录&#xff0c;首先你得是一个企业单位&#xff0c;有公章才能申请&#xff0c;申请还要花费300块大洋。 如果我们只是想学习和…

司徒理财:8.29黄金高空思路不变已盈利

黄金周五在鲍威尔的讲话中上蹿下跳&#xff0c;上探1922压制下跌&#xff0c;在1903一线探底回升&#xff0c;日线双十字K。昨日周一震荡上行&#xff0c;美盘还是冲高回落&#xff0c;日线小阳。 当前黄金走势趋于震荡&#xff0c;单从技术面来讲还是偏多&#xff0c;但是鲍威…

小白必看:期权行权前必须了解的问题。

期权的本质是一个买权或是卖权&#xff0c;也就是说你是权利方的话&#xff0c;你拥有以约定价格向对手方买入&#xff08;买权&#xff09;或卖出&#xff08;卖权&#xff09;一定数量标的的权利。期权行权就是从对手方买入&#xff0c;或向其卖出标的&#xff01;下文介绍小…

【实训项目】“魔法”APP-模型爱好者线上线下交流平台

1.设计摘要 自从2018年万代把翻模厂商龙桃子&#xff0c;后国内的模型厂商就开始逐渐慢慢的从单纯的翻模转向做魔改合金模型&#xff0c;一是由于单纯的出翻模的利润太低&#xff0c;二是由于翻模被万代查水表的风险很大。于是&#xff0c;国内的一些厂商把眼光转向合金成品&a…

网卡抓不到带Tag的数据包

Tag抓取修改注册表 用于解决网卡抓不到带Tag的数据包 一、修改查看网卡信息 1、打开网络适配器选项&#xff0c;右键需要修改的网卡–属性 2、在配置–高级中&#xff0c;找到优先级和VLAN&#xff0c;选择优先级和VLAN关闭&#xff0c;确认。 3、确认网卡驱动关键字 网卡右…

vue2 组件库之vetur提示

当我们开发完自定义UI组件库后&#xff0c;在项目中使用时&#xff0c;想要达到以下提示效果&#xff0c;组件提示与属性提示&#xff0c;有什么解决方案呢&#xff1a; 事实上&#xff0c;这是vetur的功能&#xff0c;原文如下&#xff1a; Component Data | Vetur If a pac…