首页 > 系统相关 >C++系列十:日常学习-进程间通讯

C++系列十:日常学习-进程间通讯

时间:2023-09-21 20:55:35浏览次数:35  
标签:文件 通讯 hPipe 通信 C++ 管道 用于 日常 进程

目录

前言

V~~~V。

介绍

进程间通讯(Inter-Process Communication,IPC)是操作系统中的一个重要概念,用于不同进程之间的数据传输和交互。有多种方式可以实现进程间通讯,以下是其中一些常见的方式:

  1. 管道(Pipe):管道是一种单向通信方式,通常用于具有父子关系的进程之间。它分为有名管道和无名管道(也称为匿名管道)。有名管道允许不相关的进程之间通信,而无名管道只能用于有共同祖先的进程之间。
  2. 命名管道(FIFO):命名管道是一种有名管道,它允许不相关的进程通过一个命名管道文件进行通信。这种方式通常用于进程之间的跨越多个终端或主机的通信。
  3. 消息队列(Message Queues):消息队列是一种进程间通信的方式,允许多个进程通过发送和接收消息来进行通信。消息队列通常提供一种异步通信的机制,其中进程可以发送消息而无需等待接收方立即响应。
  4. 信号(Signal):信号是一种轻量级的通信方式,用于在进程之间发送简短的通知或事件。例如,一个进程可以向另一个进程发送信号来请求其终止或处理特定事件。
  5. 共享内存(Shared Memory):共享内存允许多个进程访问同一块内存区域,从而实现高效的数据共享。然而,共享内存需要进行同步和互斥以避免数据竞争。
  6. 套接字(Socket):套接字是一种用于网络通信的通用方法,但它也可以用于本地进程间通信。通过套接字,进程可以在不同计算机上或同一计算机上的不同进程之间进行双向通信。
  7. 文件锁(File Locking):文件锁可以用于进程之间的同步和通信。多个进程可以使用文件锁来协调对共享文件的访问,以确保数据的一致性。
  8. 信号量(Semaphore):信号量是一种用于进程间同步的通信机制,通常用于控制多个进程对共享资源的访问。信号量可以用于实现互斥和同。
//管道(Pipe)
//程序一:
#include <iostream>
#include <windows.h>
int main() {
    HANDLE hPipe;
    const char* message = "Hello, Pipe!";
    DWORD bytesWritten;
    std::cout << "Messag";
    // 创建管道
    hPipe = CreateNamedPipe(
        L"\\\\.\\pipe\\MyPipe",  // 管道名称
        PIPE_ACCESS_OUTBOUND,   // 只写管道
        PIPE_TYPE_BYTE,         // 字节类型的管道
        1,                      // 最大管道实例数
        0,                      // 输出缓冲区大小
        0,                      // 输入缓冲区大小
        0,                      // 默认等待时间
        NULL                    // 默认安全属性
    );

    if (hPipe == INVALID_HANDLE_VALUE) {
        std::cerr << "Failed to create pipe. Error code: " << GetLastError() << std::endl;
        return 1;
    }
    // 连接管道
    if (ConnectNamedPipe(hPipe, NULL)) {
        // 向管道写入数据
        WriteFile(hPipe, message, strlen(message), &bytesWritten, NULL);
        std::cout << "Message sent to pipe: " << message << std::endl;
    }
    // 关闭管道
    CloseHandle(hPipe);
    system("pause");
    return 0;
}


//程序二:
#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::cerr << "Failed to open pipe. Error code: " << GetLastError() << std::endl;
        return 1;
    }
    // 从管道读取数据
    ReadFile(hPipe, buffer, sizeof(buffer), &bytesRead, NULL);
    buffer[bytesRead] = '\0';
    std::cout << "Received message from pipe: " << buffer << std::endl;
    // 关闭管道
    CloseHandle(hPipe);
    system("pause");
    return 0;
}

照片:

  1. 管道:要先运行程序一。
    img

后续:

慢慢来,还有没有细究其中的道道。后面在补充吧。

标签:文件,通讯,hPipe,通信,C++,管道,用于,日常,进程
From: https://www.cnblogs.com/zhouyitty/p/17720922.html

相关文章

  • C++-内存管理
    今天,和大家分享一些与内存管理相关的知识,本次的内容主要是new和delete的使用。内存这一块的知识,我们在学习C语言的时候,就有作相对细致的了解。我们现在来写几道题。做一个简单的回顾复习。内存的分布我们先来看看,下面一段代码:intglobalVar=1;staticintstaticGlobalVar=1;v......
  • C++中文开发【笑】
    娱乐一下,切勿上纲上线。你会不会还在为代码中众多英文单词感到苦恼。现在只需要引入一个库,你就可以进行C++真·中文开发。示例代码:#include"chinesecpp.h"使用命名空间std;整型划分数组(整型指针数组,整型左下标,整型右下标){ 整型主元位置=(左下标+右下标)......
  • C++ RAII在HotSpot VM中的重要应用
    RAII(ResourceAcquisitionIsInitialization),也称为“资源获取就是初始化”,是C++语言的一种管理资源、避免泄漏的惯用法。C++标准保证任何情况下,已构造的对象最终会销毁,即它的析构函数最终会被调用。简单的说,RAII的做法是使用一个对象,在其构造时获取资源,在对象生命期控制范围之下......
  • 工控机连接Profinet转Modbus RTU网关与水泵变频器Modbus通讯
    Profinet转ModbusRTU网关是一个具有高性能的通信设备,它能够将工控机上的Profinet协议转换成水泵变频器可识别的ModbusRTU协议,实现二者之间的通信。通过这种方式,工控机可以直接控制水泵变频器的运行状态,改变其工作频率,从而实现对水泵的精确控制。工控机连接Profinet转ModbusRTU......
  • Profinet转Modbus RTU网关连接PLC与多功能电表modbus通讯
    Profinet是一种工业以太网通讯协议,广泛用于工业自动化系统中。而ModbusRTU是一种串行通信协议,常用于PLC和仪表之间的通讯。Profinet转ModbusRTU网关(XD-MDPN100)的作用就是将Profinet协议转换为ModbusRTU协议,从而实现PLC和多功能电表之间的通讯。在工业自动化系统中,PLC常常需......
  • 工控机通过Profinet转Modbus RTU网关与报警控制仪通讯案例
    本文将以工控机通过Profinet转ModbusRTU网关(XD-MDPN100)与报警控制仪通讯的实际案例为例,介绍Profinet转ModbusRTU网关(XD-MDPN100)在工业通信的应用。在某个生产车间的报警系统中,报警控制仪是起到监测和控制作用的关键设备。由于生产车间内设备众多,且距离较远,无法直接通过ModbusR......
  • 湖南大学个人项目C++互评
    优点模块化设计:代码有一个良好的模块化设计,其中每个类和函数都有一个特定的目的。可扩展性:由于使用了继承和多态,该设计易于扩展。例如,添加新类型的问题生成器相对简单。用户交互:代码包含用户交互,允许用户登录并选择问题类型和数量。文件操作:代码成功地将生成......
  • PLC通过Modbus转Profinet网关与合康变频器Modbus通讯案例
    PLC通过Modbus转Profinet网关(XD-MDPN100)与合康变频器Modbus通讯,实现了两个设备之间的数据交互。Profinet是一种基于以太网的实时工控网络协议,而Modbus是一种常用的工业通信协议。通过Modbus转Profinet网关(XD-MDPN100),PLC实现了对合康变频器的监控和操作。操作人员可以通过Profinet......
  • C++ RAII在HotSpot VM中的重要应用
    RAII(ResourceAcquisitionIsInitialization),也称为“资源获取就是初始化”,是C++语言的一种管理资源、避免泄漏的惯用法。C++标准保证任何情况下,已构造的对象最终会销毁,即它的析构函数最终会被调用。简单的说,RAII的做法是使用一个对象,在其构造时获取资源,在对象生命期控制范围之下......
  • c++并发编程实战-第4章 并发操作的同步
    等待事件或等待其他条件坐车案例想象一种情况:假设晚上坐车外出,如何才能确保不坐过站又能使自己最轻松?方法一:不睡觉,时刻关注自己的位置1#include<iostream>2#include<thread>3#include<mutex>4usingnamespacestd;56mutex_mtx;7boolbFlag=false;......