【C/C++实现进程间通信 三】管道通信机制

news2024/12/24 3:31:49

文章目录

  • 前情回顾
  • 思路
  • 源码
      • Publisher.cpp
      • Subscriber.cpp
  • 效果

前情回顾

上一期已经讲解过了进程的相关概念以及进程间通信的实现原理,下面仅展示管道通信机制实现进程间通信的相关代码。

思路

/*
    本项目主要用于以管道通信的方式进行进程间通信的测试。
    1.主要包含PublisherDemo和SubscriberDemo两个子项目,分别用于发送信息和接收信息。
    2.在PublisherDemo中,程序创建一个命名管道,并连接到该管道。然后,使用WriteFile函数向管道写入消息。
    3.在SubscriberDemo中,程序连接到同一个命名管道,并使用ReadFile函数从管道读取消息,并打印收到的消息。
*/

源码

环境:Windows 64位 + QtCreator
涉及到一些WINAPI中的函数,具体函数解析可自行参考WINAPI官方文档

Publisher.cpp

#include <iostream>
#include <Windows.h>
#include <WinUser.h>

#pragma comment "win32.lib"

int main() {
    HANDLE hPipe;
    char buffer[1024];
    DWORD bytesRead;

    // 创建管道
    hPipe = CreateNamedPipe(
        L"\\\\.\\pipe\\MyPipe",     // 管道名称
        PIPE_ACCESS_OUTBOUND,      // 只用于写入
        PIPE_TYPE_BYTE | PIPE_WAIT,// 字节类型,阻塞模式
        1,                         // 最多可以有一个实例
        0,                         // 输出缓冲区大小
        0,                         // 输入缓冲区大小
        0,                         // 默认超时时间
        NULL                       // 默认安全性
    );

    if (hPipe == INVALID_HANDLE_VALUE) {
        std::cout << "Error: Failed to create pipe!" << std::endl;
        return 1;
    }
    std::cout << "Success to Create MyPipe!" << std::endl;

    // 连接到管道
    if (!ConnectNamedPipe(hPipe, NULL)) {
        std::cout << "Error: Failed to connect to pipe!" << std::endl;
        CloseHandle(hPipe);
        return 1;
    }
    std::cout << "Success to connect MyPipe!" << std::endl;

    // 发送消息
    strcpy_s(buffer, "Hello, cxk!");
    while(1)
    {
        if (!WriteFile(hPipe, buffer, strlen(buffer) + 1, &bytesRead, NULL)) {
            std::cout << "Error: Failed to write to pipe!" << std::endl;
            CloseHandle(hPipe);
            return 1;
        }
        std::cout << "Send message: Hello, cxk!" << std::endl;
        Sleep(1000);
    }


    // 关闭管道
    CloseHandle(hPipe);
    getchar();
    return 0;
}

Subscriber.cpp

#include <iostream>
#include <Windows.h>

int main() {
    HANDLE hPipe;
    char buffer[1024];
    DWORD bytesRead;

    // 连接到管道
    hPipe = CreateFile(
        L"\\\\.\\pipe\\MyPipe", // 管道名称
        GENERIC_READ,          // 只用于读取
        0,                     // 共享模式,默认为独占
        NULL,                  // 默认安全性
        OPEN_EXISTING,         // 打开现有的管道
        0,                     // 默认属性
        NULL                   // 默认模板
    );

    if (hPipe == INVALID_HANDLE_VALUE) {
        std::cout << "Error: Failed to connect to pipe!" << std::endl;
        return 1;
    }
    std::cout << "Success to connect MyPipe!" << std::endl;

    while(1)
    {
        // 读取消息
        if (!ReadFile(hPipe, buffer, sizeof(buffer), &bytesRead, NULL)) {
            std::cout << "Error: Failed to read from pipe!" << std::endl;
            CloseHandle(hPipe);
            return 1;
        }

        std::cout << "Received message: " << buffer << std::endl;

        Sleep(1000);
    }

    // 关闭管道
    CloseHandle(hPipe);

    return 0;
}

注:以上程序运行顺序应该为:先启动Publisher.exe,再启动Subscriber.exe。

效果

在这里插入图片描述

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

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

相关文章

Java面试Day17

1.什么是 Java 内部类&#xff1f; 内部类的分类有哪些 &#xff1f;内部类有哪些优点和应用场景&#xff1f; 顾名思义&#xff0c;内部类是指定义在某一个类中的类&#xff0c;主要分为成员内部类&#xff0c;静态内部类&#xff0c;局部内部类和匿名内部类四种。 创建与获取…

(五)python实战——使用sqlalchemy完成Sqlite3数据库表的增、删、查、改操作案例

前言 本节内容我们使用sqlalchemy框架完成Sqlite3数据库表的增删查改等常规操作&#xff0c;相较于原生Sqlite的数据库操作&#xff0c;sqlalchemy通过ORM映射完成实体对象的映射&#xff0c;通过映射关系完成对象和数据的转换&#xff0c;完成数据的操作。 正文 ①在项目中…

基于Tars高并发IM系统的设计与实现-基础篇

基于Tars高并发IM系统的设计与实现–基础篇 作者简介 兰怀玉 毕业于中央民族大学计算机专业 先后供职国内外多家公司软件研发设计岗位&#xff0c;有丰富的软件研发经验。 从事IM领域设计研发十余年&#xff0c;先后领衔多个IM通讯系统设计与研发发&#xff0c;拥有丰富的IM系…

算法:哲学家就餐问题

问题描述 由Dijkstra提出并解决的哲学家就餐问题是典型的同步问题。该问题描述的是五个哲学家共用一张圆桌&#xff0c;分别坐在周围的五张椅子上&#xff0c;在圆桌上有五个碗和五只筷子&#xff0c;他们的生活方式是交替的进行思考和进餐。平时&#xff0c;一个哲学家进行思考…

大语言模型微调和PEFT高效微调

目录标题 1 解释说明1.1 预训练阶段1.2 微调阶段2 几种微调算法2.1 在线微调2.2 高效微调2.2.1 RLHF2.2.2 LoRA2.2.3 Prefix Tuning2.2.4 Prompt Tuning2.2.5 P-Tuning v21 解释说明 预训练语言模型的成功,证明了我们可以从海量的无标注文本中学到潜在的语义信息,而无需为每一…

信号链噪声分析11

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 提示&#xff1a;这里可以添加技术概要 如今的射频(RF)系统变得越来越复杂。高度的复杂性要求所有系统指标&#xff08;例如严格的 链接和噪声预算&#xff09;达到最佳性能。确保整个信号链的正确设计至关重要。而信…

深入乳腺癌谜团:无监督学习与R语言的勘探之旅

一、引言 乳腺癌作为全球常见的恶性肿瘤&#xff0c;给患者和医学界带来了巨大的挑战。据世界卫生组织的数据显示&#xff0c;乳腺癌是妇女中最常见的癌症之一&#xff0c;并且是全球癌症相关死亡的主要原因之一[1]。因此&#xff0c;研究乳腺癌&#xff0c;并努力提高其早期检…

1085会议桌牌

机种名 蓝牙会议桌牌 型号 PE1085R_D_BLE 外观尺寸 280x58x129.9mm 可视区域 258.7690.68mm 外观颜色 银色 工作电源 3.7V锂电池供电&#xff0c;Type C充电口 显示技术 E-INK电子纸&#xff0c;双屏 像素 1360x480 像素颜色 黑/白/红 视角 约180 适用温度 …

【Java】直接return 会触发try-catch 里面的finally的方法么

&#x1f431;‍&#x1f680;/背景 try-catch 主要的作用是捕获异常&#xff0c;那么程序没有异常&#xff0c;finally里面代码能否执行&#xff1f; 特别是如果我们前面进行了加锁等操作&#xff0c;没有释放锁&#xff0c;那不是会造成业务逻辑问题, 先说结论&#xff1a;…

Eclipse成立新工作组,华为和谷歌等是初始成员

日前一个供应商中立&#xff0c;并由社区支持的Visual Studio第三方开源市场Open VSX Registry迎来新工作组的成立。根据了解&#xff0c;开发者可以在Open VSX Registry当中的市场中自由上架、下载安装Visual Studio的各种第三方扩展。 随即Eclipse基金会宣告成立了Open VSX工…

前缀迷宫:解密力扣统计包含给定前缀的字符串

本篇博客会讲解力扣“2185. 统计包含给定前缀的字符串”的解题思路&#xff0c;这是题目链接。 本题的思路是&#xff1a;遍历字符串数组&#xff0c;判断遍历到的字符串是否包含给定前缀。 判断的方法是&#xff1a;使用strncmp函数&#xff0c;比较该字符串的前strlen(pref)…

【Linux】工具介绍——vim及gcc

前言 在Linux操作系统之中有很多使用的工具&#xff0c;我们可以用vim来进行程序的编写&#xff0c;然后用gcc来生成可执行文件&#xff0c;最终运行程序。本文来带大家了解vim和gcc&#xff0c;以及自动化构建工具Makefile&#xff0c;这三个工具的使用方法。 一、vim 1.vi…

Webpack打包arcgis js api 3.x纯html+JS+CSS项目

需求 小项目。纯HTMLJSCSS已经部署上线&#xff0c;但是没有做混淆加密&#xff0c;需要进行混淆加密 分析 目前代码里面需要混淆加密的有main.js&#xff0c;其他的不用混淆加密。所以只需要对main.js进行混淆加密就可&#xff0c;但是要保证混淆加密之后能够访问方法。由于…

C#中的自定义组件(单一组件和复杂组件)

简单的应用程序开发可能不必要制作组件&#xff0c;C#中丰富的组件足以应对绝大多数的开发设想。 稍微复杂一些的应用开发&#xff0c;或者平台开发&#xff0c;或者团队开发&#xff0c;不可避免地要涉及到基础库的搭建&#xff0c;其中会有很多用户组件的设计与开发。 组件分…

计算机视觉 - 理论 - 从卷积到识别

计算机视觉 - 理论入门 前言一&#xff0c;导论&#xff1a;二&#xff0c;卷积&#xff1a;图像去噪&#xff1a;常值卷积&#xff1a;高斯卷积&#xff1a;椒盐去噪&#xff1a;锐化程度&#xff1a; 三&#xff0c;边缘检测&#xff1a;图像信号导数&#xff1a;求导算子:图…

计算机网络-网络层上篇

目录 一、网络层概述 二、网络层提供的两种服务 &#xff08;一&#xff09;面向连接的虚电路服务 &#xff08;二&#xff09;无连接的数据报服务 &#xff08;三&#xff09;虚电路服务与数据报服务的比较 三、IPv4地址及其应用 &#xff08;一&#xff09;IPv4地址概…

【AI底层逻辑】——篇章4:大数据处理与挖掘

目录 引入 一、大数据概述 二、数据处理的流程&方法 1、数据收集——“从无到有” 2、数据加工——“从有到能用” 3、数据分析 三、大数据改变了什么 往期精彩&#xff1a; 引入 AI的表现依赖大数据。曾经一段时间&#xff0c;对于图像识别的准确率只能达到60%~70…

BUUCTF 还原大师 1

题目描述&#xff1a; 我们得到了一串神秘字符串&#xff1a;TASC?O3RJMV?WDJKX?ZM,问号部分是未知大写字母&#xff0c;为了确定这个神秘字符串&#xff0c;我们通过了其他途径获得了这个字串的32位MD5码。但是我们获得它的32位MD5码也是残缺不全&#xff0c;E903???4D…

Elasticsearch 集群日志收集搭建

Elasticsearch-7.2.0Logstash-7.2.0Kibana-7.2.0-Filebeat-7.6.0 第一台集群内网ip&#xff1a;10.0.0.223 ES配置文件&#xff1a;/es_data/es/elasticsearch-7.2.0/config/elasticsearch.yml ES启动命令&#xff1a;/es_data/es/elasticsearch-7.2.0/bin/elasticsearch cl…

报道|本科专业对收入影响巨大!最高以及最低收入的专业有这些

作者&#xff1a;Aimee Picchi 编者按 本文引用并翻译了发表在美国CBS的最新研究&#xff0c;希望能给刚高考完正在挑选大学以及专业的准大学生们一点帮助哦。 最新的研究发现&#xff0c;一个学生的专业和母校能明显地影响ta毕业四年后的收入水平。HEA Group的调查显示&#x…