命名管道使用示例

news2024/11/16 21:26:25

用命名管道实现client和server端进行通信

【实现步骤】

  1. 创建两个没有关系的进程--》编写client和server源文件,并分别编译成可执行程序;
  2. 创建命名管道文件,用函数int mkfifo(const char *filename,mode_t mode);
  3. client端以写的方式打开管道文件,server端以读的方式打开管道文件
  4. 进行相应的通信--》我们实现server要接受到client发送的信息(同步)

 client.cc代码实现

#include<iostream>
#include<string>
#include<cstring>
#include<cassert>
#include<vector>

using std::cout;
using std::endl;
using std::cin;

#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<fcntl.h>

#include"comm.hpp"

//用户端,用来写

int main()
{
    //1. 以写方式打开管道文件
    int wfd=open(fifoname.c_str(),O_WRONLY);
    assert(wfd!=-1);
    (void)wfd;

    //2. 开始进程间通信,将用户的输入的信息写给服务端
    char buffer[NUM]={0};
    while(true)
    {
        //2.1 换行控制服务端的信息同步
        // cout<<"请输入你的信息#";
        // char* msg=fgets(buffer,sizeof(buffer)-1,stdin);
        // assert(msg!=nullptr);
        // (void)msg;
        // msg[strlen(msg)-1]=0;
        // int n=write(wfd,msg,strlen(msg));
        // assert(n>0);
        // (void)n;

        //2.2 实现服务端和用户端输入的信息同步
        system("stty raw");
        int c = getchar();
        system("stty -raw");
        int n=write(wfd,(char*)&c,sizeof(char));
        assert(n>0);
        (void)n;
    }

    close(wfd);

    return 0;
}

server.cc代码实现

#include<iostream>
#include<string>
#include<cstring>
#include<cassert>
#include<vector>

using std::cout;
using std::endl;
using std::cin;

#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<fcntl.h>

#include"comm.hpp"

//服务端,进行读
int main()
{
    //1. 创建管道文件
    int ret=mkfifo(fifoname.c_str(),mode);
    assert(ret==0);
    (void)ret;

    cout<<"创建管道文件成功"<<endl;
    //2. 打开管道文件
    int rfd=open(fifoname.c_str(),O_RDONLY);
    assert(rfd!=-1);
    (void)rfd;
    cout<<"以读方式打开管道文件成功"<<endl;

    //3.开始通信,接受客户端传来的信息
    char buffer[NUM]={0};
    while(true)
    {
        int n=read(rfd,buffer,sizeof(buffer)-1);
        if(n>0)
        {
            buffer[n]=0;
            //cout<<"client#"<<buffer<<endl;
            printf("%c",buffer[0]);
            fflush(stdout);
        }
        else if(n==0)
        {
            cout<<"client quit,me too"<<endl;
            break;
        }
        else
        {
            perror("read error:");
            break;
        }
    }

    ret=unlink(fifoname.c_str());
    assert(ret==0);
    (void)ret;
    cout<<"删除管道文件成功"<<endl;

    close(rfd);
    cout<<"关闭读端管道文件成功"<<endl;
    sleep(2);
    return 0;
}

makefile文件

 

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

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

相关文章

日志消息直接发送到kafka设计

背景&#xff1a; 日常工作中&#xff0c;我们一般都有需要分析业务日志的需求&#xff0c;有些业务日志记录了用户点击或者用户购买行为等有用的信息&#xff0c;所以我们一般都需要基于这些日志进行分析&#xff0c;本文我们就来看一下这种日志消息的流转图 技术方案&#…

阿里云ECS扩容硬盘空间及文件系统

一.通过阿里云控制台扩容硬盘 前往ECS实例详情页面的云盘页签。 登录ECS管理控制台。在左侧导航栏&#xff0c;选择实例与镜像 > 实例。在顶部菜单栏处&#xff0c;选择目标ECS实例所在地域。找到待扩容云盘所在的实例&#xff0c;单击实例ID。在实例详情页面&#xff0c;单…

一起来探索录音转文字哪个软件好用

在数字时代&#xff0c;录音转文字技术成为了一种不可或缺的工具&#xff0c;通过将语音内容转化为可编辑和搜索的文字&#xff0c;从而为我们带来了许多便利。那本文将探讨录音转文字的好处&#xff0c;并分享一些实际案例以及录音转文字软件。那么如果你还不知道录音转文字哪…

想做软件测试工程师,这7件事你必须先知道

目录 一、“开发者测试” 就是“开发者来测试” 二、没有什么测试不可以“自动化测试” 三、开发者测试”利在当下“&#xff0c;”赢得未来“ 四、TDD不是必须先写测试代码 五、UT覆盖率100%真的很不好 六、用测试来驱动架构和代码质量 七、从“我要写测试依赖代码”到“…

在iPad上轻松做笔记和绘画,西圣Pencil上手

触控笔是一种提高工作学习效率的方便工具&#xff0c;尤其是和平板搭配使用。但是iPad的Apple Pencil价格昂贵&#xff0c;不适合学生等经济条件有限的用户&#xff0c;所以他们需要寻找一些性价比高的国产替代品。我最近用了一支国产的电容触控笔&#xff0c;叫做西圣Pencil触…

[C++] C++11新特性分析介绍(1): 列表初始化、右值引用、完美转发、移动语义...

文章目录 [toc] C11介绍统一的列表初始化 {}initializer_list新的声明autodecltypenullptr 范围for智能指针STL 新容器**右值引用 ****容器中 另外的右值引用 **万能引用与完美转发 ****新的类功能新默认成员函数强制生成默认函数的关键字 default禁止生成默认函数的关键字 del…

【网络安全】带你了解什么是【黑客】

文章目录 背景定义分类白帽黑客&#xff08;White Hat Hacker&#xff09;黑帽黑客&#xff08;Black Hat Hacker&#xff09;灰帽黑客&#xff08;Gray Hat Hacker&#xff09; 黑客文化伦理问题黑客常用的攻击手段黑客攻击用户的常用策略有以下这些&#xff1a;防御黑客攻击的…

[Android 13]Binder系列--获取服务

获取服务 hongxi.zhu 2023-7-8 一、客户端发起获取服务 以SurfaceFlinger进程中获取InputFlinger服务为例 frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp sp<IBinder> input(defaultServiceManager()->getService(String16("inputflinger"…

Redis+IDEA极速了解和实现单机锁和分布式锁

单机下&#xff1a; 只适用于单机环境下&#xff08;单个JVM&#xff09;&#xff0c;多个客户端访问同一个服务器 1.synchronized package com.cloud.SR.controller;import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.cor…

跟我一起从零开始学python(六)数据库编程:MongoDB数据库

前言 回顾之前讲了python语法编程 &#xff0c;必修入门基础和网络编程&#xff0c;多线程/多进程/协程等方面的内容&#xff0c;昨天和今天讲到了数据库编程篇MySQL&#xff0c;Redis今天第三篇MongoDB篇&#xff0c;前面没看的也不用往前翻&#xff0c;系列文已经整理好了&a…

多线程与并发编程【线程对象锁、死锁及解决方案、线程并发协作、生产者与消费者模式】(四)-全面详解(学习总结---从入门到深化)

目录 使用Class作为线程对象锁 使用自定义对象作为线程对象锁 死锁及解决方案 线程并发协作(生产者/消费者模式) 实现生产者与消费者模式 使用Class作为线程对象锁 语法结构&#xff1a; synchronized(XX.class){//同步代码} 或 synchronized public static void access…

【大语言模型】LLM应用程序的新兴体系结构

LLM应用程序的新兴体系结构 LLM应用栈设计模式&#xff1a;In-context learningData Preprocessing/EmbeddingPrompt Construction/RetrievalPrompt Execution/Inference What about agents?展望参考资料 大型语言模型是构建软件的强大新基元。但由于它们非常新颖且与常规计算…

css写法、颜色显示方式

一、什么是css 二、css的几种写法 1、行内样式 css写在标签的style属性上&#xff0c;优先级非常高&#xff0c;但是有多个标签具有相同样式代码重复高 2、页面样式 此时写在head&#xff08;不可见&#xff09;中&#xff0c;用style标签 3、外联样式 css样式也可以导入 一…

C++primer(第五版)第十六章(模板与泛型编程)

16.1定义模板 关于模板,第一个要提的点就是,这个字念mu模板而不是mo(一开始打字就发现拼音错了,突然觉得自己要会小学深造一下). 模板就是将一个特定场合使用的东西变成可以在多个场合使用的东西. 16.1.1函数模板 template<typename T> bool bijiao(T &a,T &…

了解 IPNS:我们可以使用 4EVERLAND IPNS Manager 做什么?

关键词&#xff1a;4EVERLAND、IPNS、4EVERLAND IPNS 管理器、去中心化内容 IPNS 是星际名称系统的缩写&#xff0c;是一个允许我们在 IPFS&#xff08;星际文件系统&#xff09;内创建可变指针以及名称和地址内容的系统。IPFS 使用内容标识符 (CID) 作为唯一文件标识符&#…

Photoshop制作Alphas(没有显卡好痛苦,两个MAYA交替弄)

做个选区&#xff0c;选白色 擦除背景 在把背景填充上白色

【PyGIS】GDAL及Rasterio多线程转换NC格式文件为TIFF

汇总 【GIS】使用cdsapi下载ERA5和ERA5_land逐小时数据 NC格式介绍 说明 NC文件读取使用netCDF4,NC文件转换为TIF使用rasterio或者GDAL。 一些细节: 格点数据转换为TIFF文件时候,计算六参数时候,应该要考虑,格点数据存储的坐标属于栅格中心点的位置,转换为TIFF时候,…

Java----使用eureka进行注册连接(微服务简单实现)

当采用微服务架构时&#xff0c;各个业务流程被逐一分解&#xff0c;虽说是分解&#xff0c;但还是要进行连接的&#xff0c;最简单的就是使用http请求&#xff0c;将他们联系起来&#xff0c;通过给容器注入restTemplate&#xff0c;然后使用内置的方法进行请求&#xff0c;但…

基于Javaweb实现ATM机系统开发实战(四)用户修改删除功能实现

我们点一下修改&#xff0c;发现页面进行了跳转&#xff0c;跳转到了/toUpdate&#xff0c;并传递了用户的卡号。 我们可以先查看一下用户列表展示界面的前端代码&#xff1a;userlist.jsp&#xff0c;可以看到前端代码中做了跳转的动作&#xff0c;我们需要在后端中完成相应的…

VectorCAST单元测试参数配置

一、打开 VectorCAST 通常情况下&#xff0c;技术人员会配置一个脚本文件&#xff08;.bat、.cmd&#xff09;&#xff0c;用户可以通过这个脚本文件来启动 VectorCAST。使用脚本文件启动 VectorCAST&#xff0c;可以在启动时设置好编译器相关的环境变量&#xff0c;方便 Vecto…