0. 概述
依赖 Boost 库,通过共享内存机制实现守护进程与目标进程之间的心跳检测。具体实现包括:
- 守护进程端:负责创建和管理共享内存,周期性地检查目标进程的心跳状态。
- 客户端进程:在不感知守护进程的情况下,定时向共享内存中写入心跳信息,以便守护进程检测。
1. 设计思想
如图展示守护进程和客户端进程之间的交互过程。
- 客户端进程每秒更新一次心跳序列号,并将其写入共享内存。
- 守护进程定期检查共享内存中的心跳序列号,并根据检测结果返回相应的状态给客户端进程。
这种设计通过共享内存实现了守护进程对客户端进程的心跳监控功能,确保了系统中进程间的及时通信和状态监测。
2. 守护进程端主要代码分析
SharedMemoryChecker
类
#pragma once
#include <boost/interprocess/shared_memory_object.hpp>
#include <boost/interprocess/mapped_region.hpp>
class SharedMemoryChecker
{
public:
SharedMemoryChecker(const std::string &name, uint32_t size)
{
using namespace boost::interprocess;
shared_memory_object::remove(name.c_str());
//Create a shared memory object.
_shm = std::move(shared_memory_object(create_only, name.c_str(), read_write));
//Set size
_shm.truncate(size);
}
// 0 -success
// -1 - faild, but reach 3 times
// -2 - process abnormal, need killed
int check()
{
using namespace boost::interprocess;
//Map the whole shared memory in this process
mapped_region region(_shm, read_write);
uint64_t sequence = 0;
std::copy((char *)region.get_address(), (char *)region.get_address() + sizeof(sequence), (char *)&sequence);
if (sequence <= _sequence && sequence != 0)
{
_failedNum++;
if (_failedNum == 3) // check 3 times
return -2; // ops, process abnormal
else
return -1;
}
_sequence = sequence;
return 0;
}
private:
boost::interprocess::shared_memory_object _shm;
uint64_t _sequence = 0;
int _failedNum = 0;
};
分析:
SharedMemoryChecker
类负责管理共享内存,包括创建、映射和周期性检查心跳信息。- 构造函数
SharedMemoryChecker(const std::string &name, uint32_t size)
创建共享内存对象,并指定名称和大小。 int check()
方法检查共享内存中的心跳序列号,若序列号异常则返回相应的状态码,以便守护进程做进一步处理。
3. 客户端进程主要代码分析
// 该文件对应于守护进程中的共享内存检查定时器的机制
// 如启用共享内存sequence检查,应该在worker进程中集成如下类似代码
// worker进程不用感知守护进程,共享内存不存在也不会导致worker工作不正常
#include <boost/interprocess/shared_memory_object.hpp>
#include <boost/interprocess/mapped_region.hpp>
#include <iostream>
#include <string>
int main(int argc, char *argv[])
{
using namespace boost::interprocess;
try
{
while (1)
{
//Open already created shared memory object.
shared_memory_object shm(open_only, "abcd", read_write);
//Map the whole shared memory in this process
mapped_region region(shm, read_write);
// clear the memory for worker process, the other half memory is for daemon process
std::memset(region.get_address(), 0, region.get_size() / 2);
static uint64_t s_sequence = 0;
s_sequence += 1;
std::copy((char *)&s_sequence, (char *)&s_sequence + sizeof(s_sequence), (char *)region.get_address());
std::cout << "current s_sequence is: " << s_sequence << std::endl;
sleep(1);
}
}
catch (const std::exception &)
{
std::cerr << "exception: " << std::endl;
}
return 0;
}
分析:
- 客户端进程负责定时更新共享内存中的心跳信息,以便守护进程检测目标进程的运行状态。
- 每秒钟更新一次心跳序列号
s_sequence
,确保守护进程可以持续监控目标进程的运行情况。
4. 总结
本项目利用 Boost 的 boost::interprocess
实现了守护进程对目标进程的心跳检测功能,通过共享内存实现了进程间的快速通信和数据共享。这种方法适用于需要守护进程监控和管理其他进程状态的场景,确保系统的稳定和可靠运行。