跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++

libipc:轻量级跨平台 C++ 进程间通信(IPC)库

libipc 是一款轻量级、跨平台的 C++ 进程间通信(IPC)库,封装了管道、共享内存、消息队列等机制。支持 C++17/20,采用 RAII 资源管理,无额外依赖。提供 vcpkg 一键安装或源码编译两种方式。示例展示了利用共享内存实现跨进程大文件传输的完整代码,涵盖服务端发送、客户端接收及 CMake 构建脚本。适用于桌面应用、服务器多进程协作及跨平台项目场景。

雪落无声发布于 2026/3/23更新于 2026/10/721K 浏览
libipc:轻量级跨平台 C++ 进程间通信(IPC)库

1.简介

libipc 是一款轻量级、跨平台的 C++ 进程间通信(IPC)库,封装了管道、共享内存、消息队列等底层 IPC 机制,提供简洁的现代 C++ API,适配 Windows 和 Linux 系统。

设计理念:

  • 极简 API:所有功能封装在 ipc 命名空间下,无嵌套、无复杂继承,调用成本极低;
  • RAII 资源管理:所有 IPC 对象(共享内存、管道、信号量等)都遵循 RAII 原则,自动创建 / 释放资源,无内存泄漏、句柄泄漏风险;
  • 零冗余封装:底层直接调用系统原生 IPC 接口,无多余中间层,性能几乎与原生 API 持平;
  • 强类型 + 错误处理:内置 is_valid() 等状态校验接口,错误信息直观,无需手动处理系统错误码;
  • 纯 C++ 实现:无 C 语言兼容层,完美支持 C++17/20 特性,可无缝结合协程、多线程。

核心特点:

  • 推荐支持 C++17 的编译器(msvc-2017/gcc-7/clang-4)
  • 除 STL 外,无其他依赖
  • 无锁(lock-free)或轻量级 spin-lock
  • 底层数据结构为循环数组(circular array)
  • ipc::route 支持单写多读,ipc::channel 支持多写多读【注意:目前同一条通道最多支持 32 个 receiver,sender 无限制】
  • 默认采用广播模式收发数据,支持用户任意选择读写方案
  • 不会长时间忙等(重试一定次数后会使用信号量进行等待),支持超时

2.安装

2.1.vcpkg 一键安装

如果你是 Windows 开发者,且安装了 vcpkg 包管理器(C++ 最常用的包管理器),一行命令完成安装,自动配置 VS 的头文件 / 库文件路径,VS 会自动识别 libipc。

# 打开【管理员模式】的 Powershell / CMD,执行以下命令 vcpkg install libipc:x64-windows

补充:如果没装 vcpkg,可先执行这行命令安装 vcpkg:

git clone https://github.com/microsoft/vcpkg.git && cd vcpkg && .\bootstrap-vcpkg.bat

2.2.源码编译安装

1) windows 平台

# 如果是 VS2019,执行这条 cmake .. -G "Visual Studio 16 2019" -A x64 -DCMAKE_INSTALL_PREFIX=C:/libipc
# 如果是 VS2022,执行这条 cmake .. -G "Visual Studio 17 2022" -A x64 -DCMAKE_INSTALL_PREFIX=C:/libipc

C:/libipc 是安装路径,可自定义,比如 D:/libipc,记住这个路径即可。

源码编译:

cmake --build . --config Release --target ALL_BUILD -j 4

安装到路径:

cmake --install . --config Release

安装完成后,libipc 的文件自动部署到 C:/libipc:

  • 头文件:C:/libipc/include/libipc/
  • 库文件:C:/libipc/lib/ (静态库 ipc.lib + 动态库 ipc.dll)

2)Linux 平台

# 步骤 1:克隆官方源码 git clone https://github.com/meetanthony/libipc.git cd libipc && mkdir build && cd build
# 步骤 2:cmake 配置(Release 模式,安装到系统默认路径 /usr/local) cmake .. -DCMAKE_BUILD_TYPE=Release
# 步骤 3:编译源码(-j 后接 CPU 核心数,加速编译,比如-j4) make -j$(nproc)
# 步骤 4:安装到系统(核心步骤,需要 sudo 权限,自动部署头文件和库文件) sudo make install
# 刷新系统动态链接库缓存,防止 cmake/运行时找不到库 sudo ldconfig

安装完成后,libipc 的文件自动部署到:

  • 头文件:/usr/local/include/libipc/
  • 库文件:/usr/local/lib/ (动态库 libipc.so + 静态库 libipc.a)

3.使用示例

以下是 libipc 结合共享内存实现跨进程大文件传输 的完整可运行代码,包含服务端(文件发送)、客户端(文件接收) 和 跨平台 CMake 构建脚本,适配 Windows(VS2019)和 Linux 环境。

前提条件

  1. 安装 libipc:可通过 官方仓库 下载源码,或用包管理器安装
  2. 确保编译器支持 C++17 及以上(VS2019 需开启 /std:c++17)

1. 共享内存数据结构定义(ipc_shm_def.h) 用于统一服务端和客户端的内存布局与同步标志

#pragma once
#include <cstdint>
#include <string>
// 共享内存数据块大小(建议 4MB,可根据内存调整)
constexpr size_t SHM_BLOCK_SIZE = 4 * 1024 * 1024;
// 共享内存通信结构体
struct ShmFileTransfer {
    std::int64_t total_file_size; // 文件总大小
    std::int64_t current_block_idx; // 当前传输块索引
    std::int64_t current_block_size; // 当前块实际大小(最后一块可能小于 SHM_BLOCK_SIZE)
    bool transfer_finished; // 传输完成标志
    char data[SHM_BLOCK_SIZE]; // 数据缓冲区
    char file_name[256]; // 待传输文件名
};
// 共享内存名称和信号量名称(跨平台区分)
#ifdef _WIN32
const std::string SHM_NAME = "Local\\LibIPC_FileTransfer_Shm";
const std::string SEM_NAME = "Local\\LibIPC_FileTransfer_Sem";
#else
const std::string SHM_NAME = "/libipc_filetransfer_shm";
const std::string SEM_NAME = "/libipc_filetransfer_sem";
#endif

2.服务端代码(server.cpp - 读取文件并写入共享内存)

#include "ipc_shm_def.h"
#include <libipc/shm.h>
#include <libipc/sem.h>
#include <fstream>
#include <iostream>
#include <filesystem>
namespace fs = std::filesystem;
int main(int argc, char* argv[]) {
    if (argc != 2) {
        std::cerr << "Usage: " << argv[0] << " <file_path>" << std::endl;
        return 1;
    }
    std::string file_path = argv[1];
    if (!fs::exists(file_path)) {
        std::cerr << "Error: File not exists - " << file_path << std::endl;
        return 1;
    }
    // 1. 创建共享内存(大小为 ShmFileTransfer)
    ipc::shm shm(SHM_NAME, sizeof(ShmFileTransfer), ipc::shm::CREATE | ipc::shm::RW);
    if (!shm.is_valid()) {
        std::cerr << "Error: Create shared memory failed!" << std::endl;
        return 1;
    }
    // 2. 创建信号量(用于进程同步,初始值 0:客户端等待服务端写入)
    ipc::sem sem(SEM_NAME, 0, ipc::sem::CREATE);
    if (!sem.is_valid()) {
        std::cerr << "Error: Create semaphore failed!" << std::endl;
        return 1;
    }
    // 3. 映射共享内存到进程地址空间
    ShmFileTransfer* shm_data = static_cast<ShmFileTransfer*>(shm.map());
    if (shm_data == nullptr) {
        std::cerr << "Error: Map shared memory failed!" << std::endl;
        return 1;
    }
    // 4. 初始化共享内存参数
    shm_data->total_file_size = fs::file_size(file_path);
    shm_data->current_block_idx = 0;
    shm_data->transfer_finished = false;
    strncpy(shm_data->file_name, fs::path(file_path).filename().c_str(), 255);
    // 5. 打开文件并分块写入共享内存
    std::ifstream file(file_path, std::ios::binary);
    if (!file.is_open()) {
        std::cerr << "Error: Open file failed!" << std::endl;
        return 1;
    }
    std::cout << "Start transfer file: " << file_path << " (size: " << shm_data->total_file_size << " bytes)" << std::endl;
    while (true) {
        // 读取数据到共享内存缓冲区
        file.read(shm_data->data, SHM_BLOCK_SIZE);
        shm_data->current_block_size = file.gcount();
        if (shm_data->current_block_size <= 0) {
            break;
        }
        // 发送信号量,通知客户端读取
        sem.post();
        // 等待客户端读取完成(信号量减 1)
        sem.wait();
        // 更新块索引
        shm_data->current_block_idx++;
        std::cout << "Transferred block: " << shm_data->current_block_idx << " (size: " << shm_data->current_block_size << " bytes)" << std::endl;
    }
    // 6. 标记传输完成
    shm_data->transfer_finished = true;
    sem.post();
    // 最后一次发送信号,通知客户端退出循环
    // 7. 清理资源
    file.close();
    shm.unmap(shm_data);
    std::cout << "File transfer completed!" << std::endl;
    return 0;
}

3.客户端代码(client.cpp - 从共享内存读取并写入文件)

#include "ipc_shm_def.h"
#include <libipc/shm.h>
#include <libipc/sem.h>
#include <fstream>
#include <iostream>
#include <filesystem>
namespace fs = std::filesystem;
int main() {
    // 1. 打开共享内存(只读)
    ipc::shm shm(SHM_NAME, sizeof(ShmFileTransfer), ipc::shm::RW);
    if (!shm.is_valid()) {
        std::cerr << "Error: Open shared memory failed! (Please start server first)" << std::endl;
        return 1;
    }
    // 2. 打开信号量
    ipc::sem sem(SEM_NAME);
    if (!sem.is_valid()) {
        std::cerr << "Error: Open semaphore failed!" << std::endl;
        return 1;
    }
    // 3. 映射共享内存到进程地址空间
    ShmFileTransfer* shm_data = static_cast<ShmFileTransfer*>(shm.map());
    if (shm_data == nullptr) {
        std::cerr << "Error: Map shared memory failed!" << std::endl;
        return 1;
    }
    // 4. 创建输出文件
    std::string output_path = "recv_" + std::string(shm_data->file_name);
    std::ofstream file(output_path, std::ios::binary | std::ios::trunc);
    if (!file.is_open()) {
        std::cerr << "Error: Create output file failed!" << std::endl;
        return 1;
    }
    std::cout << "Start receive file: " << output_path << " (total size: " << shm_data->total_file_size << " bytes)" << std::endl;
    // 5. 循环读取共享内存数据
    while (true) {
        // 等待服务端写入数据
        sem.wait();
        // 检查传输是否完成
        if (shm_data->transfer_finished) {
            break;
        }
        // 写入数据到文件
        file.write(shm_data->data, shm_data->current_block_size);
        // 发送信号量,通知服务端继续写入
        sem.post();
        std::cout << "Received block: " << shm_data->current_block_idx + 1 << " (size: " << shm_data->current_block_size << " bytes)" << std::endl;
    }
    // 6. 清理资源
    file.close();
    shm.unmap(shm_data);
    std::cout << "File receive completed! Saved to: " << output_path << std::endl;
    return 0;
}

4.跨平台 CMake 构建脚本(CMakeLists.txt) 适配 Windows VS2019 和 Linux,自动查找 libipc 库

cmake_minimum_required(VERSION 3.15)
project(LibIPC_FileTransfer)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# 查找 libipc 库
find_package(libipc REQUIRED)
# 头文件目录
include_directories(${CMAKE_CURRENT_SOURCE_DIR})
# 服务端可执行文件
add_executable(ipc_file_server server.cpp)
target_link_libraries(ipc_file_server PRIVATE libipc::libipc)
# 客户端可执行文件
add_executable(ipc_file_client client.cpp)
target_link_libraries(ipc_file_client PRIVATE libipc::libipc)
# Windows 平台特殊配置(VS2019)
if(WIN32)
    # 启用大文件支持
    target_compile_definitions(ipc_file_server PRIVATE _LARGEFILE64_SOURCE _FILE_OFFSET_BITS=64)
    target_compile_definitions(ipc_file_client PRIVATE _LARGEFILE64_SOURCE _FILE_OFFSET_BITS=64)
    # 设置 VS 启动项(可选)
    set_property(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY VS_STARTUP_PROJECT ipc_file_server)
endif()

4.项目的目录结构及介绍

C++ IPC 库(cpp-ipc)的目录结构如下:

cpp-ipc/
 ├── .github/ # GitHub 工作流程目录
 │ └── workflows/
 ├── 3rdparty/ # 第三方库目录
 ├── demo/ # 示例代码目录
 ├── include/ # 头文件目录
 │ └── libipc/ # IPC 库头文件
 ├── libipc/ # 库实现源文件目录
 ├── src/ # 源代码目录
 ├── test/ # 测试代码目录
 ├── .gitignore # Git 忽略文件
 ├── CMakeLists.txt # CMake 配置文件
 ├── LICENSE # 许可证文件
 ├── README.md # 项目说明文件
 └── performance.xlsx # 性能数据文件

主要目录和文件说明:

  • .github/workflows/: 存放 GitHub Actions 的工作流程文件,用于自动化项目管理任务。
  • 3rdparty/: 如果项目依赖于其他开源库,会在此目录下进行存储。
  • demo/: 包含示例代码,演示如何使用 C++ IPC 库。
  • include/libipc/: 包含项目的所有公共头文件。
  • libipc/: 包含库实现的源文件。
  • src/: 包含主要的源代码文件。
  • test/: 包含单元测试和性能测试的代码。
  • CMakeLists.txt: 用于配置 CMake 构建系统的文件。
  • README.md: 包含项目的基本介绍、安装和使用说明。
  • performance.xlsx: 记录了项目的性能测试数据。

项目的配置文件介绍 项目的配置文件主要是 CMakeLists.txt,它用于配置 CMake 构建系统。以下是配置文件的基本结构:

cmake_minimum_required(VERSION 3.10)
project(cpp-ipc)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -DNDEBUG")
if(NOT MSVC)
    set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O2")
endif()
include_directories(${CMAKE_SOURCE_DIR}/include)
set(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin)
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin)
add_subdirectory(src)
set(GOOGLETEST_VERSION 1.10.0)
add_subdirectory(3rdparty/gtest)
add_subdirectory(test)
add_subdirectory(demo/chat)
add_subdirectory(demo/msg_que)

在 CMakeLists.txt 中,首先设定了项目所需的 CMake 版本和项目名称,然后设置了 C++ 标准为 C++17。接着,添加了库搜索路径、源文件,以及链接了 IPC 库。最后,添加了测试目录,以便进行单元测试和性能测试。

5.适合的项目场景

  • 桌面端 C++ 应用的进程间通信;
  • 服务器端多进程协作(如:主进程管理子进程,子进程间数据共享);
  • 大文件传输、结构化指令下发、消息广播;
  • 跨平台 C++ 项目的 IPC 模块开发。

目录

  1. 1.简介
  2. 2.安装
  3. 2.1.vcpkg 一键安装
  4. 打开【管理员模式】的 Powershell / CMD,执行以下命令 vcpkg install libipc:x64-windows
  5. 2.2.源码编译安装
  6. 如果是 VS2019,执行这条 cmake .. -G "Visual Studio 16 2019" -A x64 -DCMAKEINSTALLPREFIX=C:/libipc
  7. 如果是 VS2022,执行这条 cmake .. -G "Visual Studio 17 2022" -A x64 -DCMAKEINSTALLPREFIX=C:/libipc
  8. 步骤 1:克隆官方源码 git clone https://github.com/meetanthony/libipc.git cd libipc && mkdir build && cd build
  9. 步骤 2:cmake 配置(Release 模式,安装到系统默认路径 /usr/local) cmake .. -DCMAKEBUILDTYPE=Release
  10. 步骤 3:编译源码(-j 后接 CPU 核心数,加速编译,比如-j4) make -j$(nproc)
  11. 步骤 4:安装到系统(核心步骤,需要 sudo 权限,自动部署头文件和库文件) sudo make install
  12. 刷新系统动态链接库缓存,防止 cmake/运行时找不到库 sudo ldconfig
  13. 3.使用示例
  14. 查找 libipc 库
  15. 头文件目录
  16. 服务端可执行文件
  17. 客户端可执行文件
  18. Windows 平台特殊配置(VS2019)
  19. 4.项目的目录结构及介绍
  20. 5.适合的项目场景

更多推荐文章

查看全部
  • 高精度算法详解:大整数加减乘除实现与原理
  • Java 核心面试实战:线程池、ThreadLocal 与 JVM 详解
  • 2025 AIGC 最具影响力 AI 应用开发平台公布
  • C++ STL 容器详解:map 与 set 的用法
  • 金融类 App 渗透测试实战:从 Weblogic 到 Shiro 反序列化
  • Spring AI Agent Skills 接入指南与原理剖析
  • 使用 opencut 进行视频去文字与动态人物擦除
  • LeetCode 顺序刷题记录(11-20)
  • 链表在内存管理与缓存淘汰中的应用
  • 微信小程序任意手机号登录漏洞原理与修复方案
  • 大模型技术入门与进阶学习指南
  • MySQL 数据库基础核心知识点梳理
  • 金融从业者必备:Python 在数据分析、量化与风控中的应用
  • JavaScript 基础语法与核心概念实战指南
  • NVIDIA AI Enterprise 运维指南:医疗行业部署与训练路径
  • 前端 AI 与营销增长领域的 AI 应用核心趋势
  • GitHub 学生开发者包认证实操指南
  • C++ 输入输出详解(上)
  • 机器学习入门:基本概念、分类与核心算法详解
  • Word MCP Server:实现 AI 对 Word 文档的创建、编辑与格式化操作

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online