讲师中心 微信公众号
AI工具推荐 视频效率加速

C++如何实现一个简单的跨进程信号通知(Signal)类

夜杰酱_2732

夜杰酱_2732

发布时间:2026-07-26 14:50:58

|

864人浏览过

|

来源于php中文网

原创

kill() 不能直接用于跨进程可靠通知,因其异步、无状态、不可靠:未注册处理器时信号被忽略,非实时信号会合并,且无法携带数据;而 eventfd 通过共享内核计数器提供原子、可控、可等待的事件通知机制。

c++如何实现一个简单的跨进程信号通知(signal)类

为什么不能直接用 kill() 发送信号到跨进程对象

Linux 的 kill() 确实能发信号(比如 SIGUSR1),但问题在于:信号是异步、无状态、不可靠的。如果接收方进程还没注册 signal() 或 sigaction() 处理器,或者信号在注册前就到达,它会被直接忽略;多个连续信号可能被合并(尤其对非实时信号);且无法携带任何数据。所以单纯封装 kill() 不构成“通知类”,只是裸系统调用转发。

用 eventfd() + fork() 模拟信号语义更可靠

eventfd() 是 Linux 特有的内核对象,支持原子写入整数、可被 epoll/poll 等待,天然适合跨进程事件通知。它比管道更轻量(无缓冲区拷贝)、比信号更可控。关键点:

  • 父进程创建 eventfd(0) 后 fork(),子进程继承 fd,双方共享同一内核 eventfd 对象
  • 通知方调用 write(eventfd_fd, &val, sizeof(val))(val 通常为 1),接收方用 read() 或 epoll_wait() 等待
  • 必须用 uint64_t 类型写入,哪怕只通知一次——这是 eventfd 的硬性要求
  • 注意关闭不需要的 fd 副本,避免资源泄漏;子进程若不读,父进程持续写会阻塞(除非创建时加 EFD_NONBLOCK)
// 示例:简单跨进程通知(父子)
#include <sys/eventfd.h>
#include <unistd.h>
#include <cstdint>

int main() {
    int efd = eventfd(0, EFD_CLOEXEC); // 初始化计数为 0
    pid_t pid = fork();
    if (pid == 0) { // child: wait
        uint64_t val;
        read(efd, &val, sizeof(val)); // 阻塞直到通知
        close(efd);
    } else { // parent: notify
        uint64_t val = 1;
        write(efd, &val, sizeof(val));
        close(efd);
        wait(nullptr);
    }
}

如何让非父子进程也能通信:用 memfd_create() 或临时文件绑定 eventfd

父子继承 fd 很方便,但任意进程间需要共享 fd。Linux 5.15+ 支持 memfd_create() 创建匿名内存文件,配合 sendmsg()/recvmsg() 传递 fd;更通用的做法是:用命名信号量(sem_open())或 Unix domain socket 传递一个预先创建好的 eventfd fd。但最简路径是——用 shm_open() + mmap() 共享一个 int 标志位,再配一个 pthread_cond_t(需放在共享内存中并正确初始化)。不过这已脱离“信号”语义,进入同步原语范畴。

更现实的选择:放弃“任意进程”,限定为“有共同祖先或约定路径的进程”。例如:

C++ Code Review Master
C++ Code Review Master

组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。

下载

立即学习“C++免费学习笔记(深入)”;

  • 接收方启动时创建 eventfd,把 fd 编号写入 /tmp/myapp-notify-fd
  • 通知方读该文件,用 dup2() 复制 fd(需确保权限和命名空间一致)
  • 或改用 AF_UNIX socket 发送 fd(通过 SCM_RIGHTS 控制消息)——这才是生产环境推荐方式

别忽略 SIGCHLD 和 signalfd() 的替代价值

如果你真正想解决的是“子进程退出后主进程感知”,那根本不需要自建通知类——直接 sigaction(SIGCHLD, &sa, nullptr) 注册处理器,或更现代地用 signalfd() 把信号转成可 read() 的 fd。后者能和 epoll 统一事件循环,避免信号中断系统调用的麻烦。

而如果你需要的是“多进程协同启停”,eventfd 是好选择;但若只是单次触发、低频、不关心丢失,kill(getpid(), SIGUSR1) 加全局 volatile flag 也够用——只是别把它包装成“可靠 Signal 类”。

真正的难点不在发送,而在接收方如何安全地从信号上下文跳转到常规执行流,以及如何避免竞态。这些细节一旦漏掉,类就只是个幻觉。

热门AI工具

更多
墨刀AI
墨刀AI Hot

一款AI图像与设计工具,主要用于产品经理的专属智能体,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

相关专题

更多
c++和c语言的区别有哪些
c++和c语言的区别有哪些

c++和c语言的区别:1、面向对象编程(OOP)支持不同;2、新增特性不同;3、标准库不同;4、编译方式不同;5、命名空间不同等等。想了解更多c++的相关内容,可以阅读本专题下面的文章。

2208

2024.03.14

c++和python学习顺序推荐
c++和python学习顺序推荐

一般建议先学习C++,再学习Python,因为这样可以逐步从较为底层的编程语言向更高级的语言过渡。想了解更多python的相关内容,可以阅读本专题下面的文章。

979

2024.03.14

python和c++学习性价比分析
python和c++学习性价比分析

Python易于学习,广泛应用于Web开发、数据科学和人工智能等领域,但性能较低。C语言性能高,适用于对性能要求较高的场景,如游戏开发和系统编程,但学习曲线陡峭,错误处理复杂。想了解更多python的相关内容,可以阅读本专题下面的文章。

407

2024.03.14

c语言和c++一样吗
c语言和c++一样吗

c语言和c++是两种不同的编程语言,虽然有相似之处,但存在显著差异。c语言专注于过程式编程和系统级开发,以简洁、高效著称。c++作为c语言的超集,引入了面向对象编程,增强了代码组织和管理能力,但学习曲线也更陡峭。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

307

2024.03.14

c语言和c++先学哪个好
c语言和c++先学哪个好

初学者选择学习c语言还是c++语言,需要根据个人学习目标、背景以及编程兴趣和预期应用方向来决定。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

386

2024.03.14

c语言和c++的区别和联系
c语言和c++的区别和联系

c语言和c++是计算机科学领域应用广泛的编程语言。虽然它们有着相似的基础,但它们在语言类型、语法功能和内存管理方面存在着显著差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

580

2024.03.14

c++软件中文更改教程
c++软件中文更改教程

对于 ide,可通过打开设置,找到语言设置,选择中文,并保存更改。对于非 ide 应用程序,可查找设置或选项,选择语言设置,更改为中文,并保存更改。想了解更多c++的相关内容,可以阅读本专题下面的文章。

1389

2024.03.21

python和java和c++学习性价比分析
python和java和c++学习性价比分析

Python以其易学性、丰富的库和活跃的社区而著称,适合数据科学、人工智能和Web开发。Java以其跨平台性、企业级应用开发和Android应用开发而闻名。C++以其底层控制能力、高效性能和游戏开发而著称。选择哪种语言取决于个人兴趣、职业方向和特定需求。想了解更多python和java和c++的相关内容,可以阅读本专题下面的文章。

1177

2024.03.22

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

0

2026.09.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Conan 2 Essentials 免费课程
Conan 2 Essentials 免费课程

共0课时 | 0人学习

CMake 与 Conan 集成实践
CMake 与 Conan 集成实践

共0课时 | 0人学习

Conan 2 高级依赖模型介绍
Conan 2 高级依赖模型介绍

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn