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

后续:

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

posted @ 2023-09-21 20:49  cactus9  阅读(289)  评论(0编辑  收藏  举报