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

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

目录

1.简介

2.安装

2.1.vcpkg 一键安装

2.2.源码编译安装

3.使用示例

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

5.适合的项目场景


1.简介

https://gitee.com/kanster/cpp-ipc

        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,编译无任何报错,这是 Windows 下最省心的安装方式!

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

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

git clone https://github.com/microsoft/vcpkg.git && cd vcpkg && .\bootstrap-vcpkg.bat
vcpkg: 一款免费开源的C++包管理器

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 # 【Linux必加】刷新系统动态链接库缓存,防止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 模块开发。

Read more

自动化机器学习实战:从调参苦力到AI工程师的解放

自动化机器学习实战:从调参苦力到AI工程师的解放

目录 摘要 1. 🎯 开篇:为什么我们需要AutoML? 2. 🧮 核心技术:超参数优化与神经架构搜索 2.1 超参数优化:从网格搜索到贝叶斯优化 2.2 神经架构搜索:让AI设计AI 3. ⚙️ 主流框架:AutoGluon vs TPOT 3.1 AutoGluon:亚马逊的工业级AutoML 3.2 TPOT:基于遗传算法的AutoML 3.3 框架性能对比 4. 🛠️ 实战:完整AutoML系统构建 4.1 自定义AutoML框架 4.2 分布式AutoML架构 5. 🏢 企业级应用:金融风控AutoML系统 5.1 系统架构设计 5.2 完整实现代码

By Ne0inhk
Flutter 组件 genkit 的适配 鸿蒙Harmony 深度进阶 - 驾驭模型幻觉审计、实现鸿蒙端多维 RAG 向量对齐与端云协同 AI 指挥中心方案

Flutter 组件 genkit 的适配 鸿蒙Harmony 深度进阶 - 驾驭模型幻觉审计、实现鸿蒙端多维 RAG 向量对齐与端云协同 AI 指挥中心方案

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 genkit 的适配 鸿蒙Harmony 深度进阶 - 驾驭模型幻觉审计、实现鸿蒙端多维 RAG 向量对齐与端云协同 AI 指挥中心方案 前言 在前文中,我们利用 genkit 实现了基础的 AI 模型流式调用(Streaming)与 Prompt 工程。但在真正的“专业级医疗诊断辅助”、“金融量化分析报告生成”或“大型智能客服矩阵”场景中。简单的模型调用仅仅是起点。面对大模型不可避免的“幻觉(Hallucinations)”问题。面对如何在鸿蒙(OpenHarmony)端实现本地向量库(Vector Store)与云端知识库的实时同步。面对如何在不同算力的设备(从手环到大屏)上分配不同的 AI

By Ne0inhk
Flutter 组件 google_generative_language_api 适配鸿蒙 HarmonyOS 实战:生成式 AI 集成,构建大语言模型调度与全场景智能推理治理架构

Flutter 组件 google_generative_language_api 适配鸿蒙 HarmonyOS 实战:生成式 AI 集成,构建大语言模型调度与全场景智能推理治理架构

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 google_generative_language_api 适配鸿蒙 HarmonyOS 实战:生成式 AI 集成,构建大语言模型调度与全场景智能推理治理架构 前言 在鸿蒙(OpenHarmony)生态迈向全场景 AI 赋能、涉及高效的语义理解、自动化内容生成及严苛的端云协同智能隐私保护背景下,如何实现一套既能深度对接 Google 生成式语言模型(如 Gemini、PaLM)、又能保障异步请求高响应性且具备多模态输入处理能力的“AI 调度中枢”,已成为决定应用智能化水平与用户体验代差的关键。在鸿蒙设备这类强调分布式协同与端侧算力按需分配的环境下,如果应用依然采用低效的 REST 手写拼接,由于由于 payload 结构复杂性,极易由于由于“协议解析异常”导致鸿蒙应用在大模型推理环节发生由于由于由于由于通讯阻塞。 我们需要一种能够统一模型调用语义、支持流式(Streaming)响应且符合鸿蒙异步异步并发范式的

By Ne0inhk
一天一个开源项目(第26篇):ZeroClaw - 零开销、全 Rust 的自主 AI 助手基础设施,与 OpenClaw 的关系与对比

一天一个开源项目(第26篇):ZeroClaw - 零开销、全 Rust 的自主 AI 助手基础设施,与 OpenClaw 的关系与对比

引言 “同样的「多模型 + 多渠道 + 记忆 + 工具」愿景,用 Rust 重写:单二进制、几 MB 内存、毫秒级启动,还能从 OpenClaw 一键迁移。” 这是"一天一个开源项目"系列的第26篇文章。今天带你了解的项目是 ZeroClaw(GitHub)。 OpenClaw(ClawdBot)是大家熟悉的 AI 助手网关:多 LLM、Telegram/Discord/飞书等多渠道、持久记忆、技能与工具,但基于 Node.js/TypeScript,运行时内存与冷启动对树莓派、低配 VPS 或边缘设备并不友好。ZeroClaw 与 OpenClaw 处于同一赛道—

By Ne0inhk