文章目录
- 前情回顾
- 思路
- 源码
- 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。
效果



















