Skip to content

Latest commit

 

History

History
95 lines (69 loc) · 4.29 KB

File metadata and controls

95 lines (69 loc) · 4.29 KB

z_ipc 库更新日志


v1.2.0 – 2026-08-26

适用范围

全平台(Linux / Windows)

兼容性

二进制不兼容(共享内存协议新增头部,需同时升级客户端和服务端)


本次更新内容

  1. 彻底消除发送阻塞(P0)

    • 所有发送操作统一替换为 try_send(),失败时立即返回 IPC_ERR_BUSY,并清理已创建的共享内存。
    • 客户端 RPC 等待响应时使用 std::shared_future::wait_for 并轮询取消标志,超时返回 IPC_ERR_TIMEOUT
    • 影响范围:call_binarynotify_binarysend_notify_binarysend_response
  2. 共享内存数据完整性校验(新增)

    • 在共享内存头部增加固定结构 ShmHeader(魔数 0xDEC0DEAD + CRC32 校验 + 数据长度)。
    • 发送方写入头部和 CRC,接收方验证,不匹配则拒绝数据并返回 IPC_ERR_RECEIVE
    • 零大小数据(__ZERO__)跳过校验。
  3. 共享内存租约机制(RAII 清理)

    • 实现 SharedMemoryLease 类,在 /dev/shm(Linux)或 %TEMP%(Windows)下创建 .lease 文件记录时间戳。
    • 析构时自动删除 lease 和共享内存;静态方法 cleanup_stale() 清理超过 30 秒的孤儿资源。
  4. 客户端 RPC 取消机制

    • 新增 IpcClient::cancel() 方法,通过原子标志中断正在等待的 call_binary,返回 IPC_ERR_CANCELED
  5. 服务端 Worker 健康监控

    • 每个 worker 线程周期性更新心跳,独立监控线程每秒检查,超时 5 秒记录警告日志(不自动重启)。
  6. 安全加固

    • 队列名称严格限制为字母、数字、下划线,防止路径遍历攻击。
    • 参数防御:thread_countmax_queue_lengthmax_msg_size 自动截断归一化。
    • 原子操作明确使用 acquire/release 内存序。
  7. 线程生命周期管理优化

    • 客户端析构/disconnect 中线程 join 设 500ms 超时;超时后 detach 并记录。
    • 服务端 stop() 中 worker 线程等待 5 秒后 join,超时后 detach 并警告。
  8. Linux 平台兼容性增强

    • CRC32 表初始化改用 std::once_flag + std::call_once,解决多线程竞态。
    • 共享内存租约路径在 Linux 下先尝试 /dev/shm,不可写时自动回退到 /tmpcleanup_stale() 同时扫描两个目录。
    • 线程终止超时后改为 detach(),避免主线程永久阻塞。

测试验证结果

测试场景 结果
Windows 综合测试套件(test_ipc.dpr,26 个子项) 全部通过
Linux 手动验证(Ubuntu 22.04,含 /dev/shm 不可写模拟) 全部通过
高并发通知(每秒 1000 条,持续 10 分钟) 无阻塞,无内存泄漏
模拟发送方崩溃(强制终止进程) 租约机制在 30 秒后自动清理残留 shm
数据篡改测试 接收方校验失败,拒绝数据并返回错误
服务端/客户端异常重启 租约清理正常,无资源残留
极端参数注入 库返回错误码,不崩溃

升级注意事项

  • 协议不兼容:必须同时升级客户端和服务端。
  • 迁移步骤
    1. 停止所有旧进程。
    2. 手动清理遗留共享内存(可运行 ipc_cleanup 或重启系统)。
    3. 部署新版本库并重启服务。

变更文件清单

文件 主要变更
z_ipc_api.h 新增 IPC_ERR_CANCELED
z_ipc_client_impl.h 新增 cancel()、取消标志
z_ipc_client_impl.cpp 全面重写:非阻塞发送、CRC 校验、租约、内存序、线程管理;增加 CRC32 线程安全初始化、租约路径回退、超时 detach
z_ipc_server_impl.h 新增心跳数组、监控线程声明
z_ipc_server_impl.cpp 全面重写:非阻塞发送、CRC 校验、租约、监控、参数防御;增加 CRC32 线程安全初始化、超时 detach
z_ipc_md5.h 无变更(仅用于日志)

后续规划

  • v1.3.0:控制消息从字符串升级为二进制协议头。
  • v2.0.0:引入共享内存环缓冲区,支持零拷贝批量传输。

本版本已通过全部回归测试,可投入生产使用。如有问题,请及时联系开发团队。