C++怎么实现两个互相看护的子进程(当其中任意一个被Kill时立即重生对方)

老磊君_7061

老磊君_7061

2026-10-22

475人浏览

原创

不能用简单fork+waitpid实现互相看护,因子进程间无父子关系,无法waitpid对方,且kill-9时另一方无法感知;真正的互相看护需通过unix域套接字心跳或prctl(pr_set_pdeathsig)配合kill(pid,0)探测并加文件锁防重复拉起。

c++怎么实现两个互相看护的子进程(当其中任意一个被kill时立即重生对方)

为什么不能用简单的 fork + waitpid 实现互相看护

直接在父进程中 fork 两次、然后用 waitpid(-1, &status, 0) 监听任意子进程退出,看似可行,但会掉进两个坑:一是当一个子进程被 kill -9 时,另一个子进程无法感知(它不是父进程,没权限 waitpid);二是两个子进程彼此不是父子关系,getppid() 查到的都是原始父进程,无法形成闭环监控。真正的互相看护必须让每个子进程都具备“观察对方生死 + 自行拉起”的能力。

用 Unix domain socket 做进程间心跳检测

核心思路是让两个子进程通过本地 socket 持续交换心跳包,一旦读超时或连接断开,就判定对方已死,立即 fork 重启它。这比依赖信号或文件锁更可靠,也不受 SIGCHLD 传递限制。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • 启动时,主进程先创建一个 AF_UNIX socket(路径如 /tmp/watchdog.sock),并绑定监听
  • 第一个子进程 fork 后,连接该 socket 并进入循环:每 500ms 发一次 "PING",同时阻塞 recv 等待对方响应;若 recv 返回 0 或 -1(且 errno != EINTR),说明对端已退出,立刻 execl 重启另一个子进程
  • 第二个子进程做同样事,只是初始连接顺序相反,或用 SOCK_DGRAM 避免连接状态管理
  • 注意:两个子进程要分别设置 sigaction(SIGPIPE, &sa, nullptr),否则发包时对端已死会触发 SIGPIPE 导致自身退出

用 prctl(PR_SET_PDEATHSIG) 让子进程感知父进程死亡

这个 Linux 特有接口能让子进程在“原父进程”退出时收到指定信号(如 SIGUSR1)。但它不适用于“互相看护”,因为两个子进程的父进程是同一个,不是彼此。不过可以借它实现“兜底保活”:每个子进程调用 prctl(PR_SET_PDEATHSIG, SIGUSR1),并在信号处理函数中检查对方是否还活着(比如通过 kill(pid_of_other, 0)),如果对方已不存在,就立即 fork 拉起。

  • 必须在 fork 后、exec 前调用 prctl,否则新进程可能已切换用户或权限丢失
  • kill(pid, 0) 只能判断进程是否存在,不能区分是僵死还是运行中,需配合 waitpid(pid, &s, WNOHANG) 清理僵尸
  • 若两个子进程都用此法,需加文件锁(flock(/tmp/watchdog.lock))避免同时尝试拉起导致重复进程

实际部署时最易忽略的三个点

第一,子进程必须忽略 SIGHUP 和 SIGINT,否则终端关闭或 Ctrl+C 会误杀整个看护链;第二,重启逻辑里不要用 system(),它会继承当前环境并可能卡住,改用 fork + execv 更可控;第三,/tmp 下的 socket 或 lock 文件要在每次启动前 unlink,否则残留会导致新进程连接失败或锁竞争。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++ c++编程 c++安全

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

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

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

2024.03.14

2248

9

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

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

2024.03.14

1019

6

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

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

2024.03.14

447

5

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

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

2024.03.14

327

5

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

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

2024.03.14

406

5

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

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

2024.03.14

580

5

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

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

2024.03.21

1409

9

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

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

2024.03.22

1217

7

c++和c语言学习顺序推荐
c++和c语言学习顺序推荐

对于初学者,建议先学习C语言,掌握编程基础后再转入C++,便于理解面向对象编程概念。有编程经验者可直接学习C++,快速接触高级编程技术。想了解更多c++和c语言的相关内容,可以阅读本专题下面的文章。

2024.03.25

1325

9

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习