第 19 章:进程拉起、守护、心跳与进程间同步
本章说明进程拉起、传统守护进程、共享内存心跳和 System V 信号量的职责边界。
1. Process、HBSystem 与 csemp 的职责
| 类 | 作用 | 不是 |
|---|---|---|
Process | fork/exec 或执行函数;可由辅助进程定时重启 | 不是完整 daemonize |
HBSystem | 共享内存登记进程、续约、检测超时、终止并重启 | 不是跨机器注册中心 |
csemp | System V 信号量,进程间互斥 | 不是线程互斥锁 |
2. Process::startProcess
// sec=-1:只启动一次。
stt::system::Process::startProcess(
"/usr/local/bin/worker",
-1,
"worker", "--port", "9000");
// sec=3:目标退出后,辅助进程等待 3 秒再重新拉起。
stt::system::Process::startProcess(
[] {
runWorker();
},
3);它不会调用 setsid()、切换工作目录、设置 umask 或重定向标准输入输出,因此准确说法是进程拉起/监督,而不是传统 Unix 守护进程。生产环境通常由 systemd、容器编排或专门的进程管理器补充完整的生命周期管理。
3. HBSystem 心跳模型
- 业务进程调用
join()登记路径、PID 和最多三个参数。 - 业务进程定期调用
renew()更新心跳。 - 独立监控进程周期性调用
HBCheck(sec)。 - 超时后发送
SIGTERM (15)并等待 8 秒;进程仍存活时发送SIGKILL (9),随后按登记信息重新拉起。
当前限制:使用固定 System V IPC key
0x5095,最多记录 1000 个进程,参数字段长度有限且最多三个参数。一个主机上部署多个独立 STTNet 集群前应规划冲突问题。4. csemp 进程间锁
stt::system::csemp lock;
if(!lock.init(0x6001))
return 1;
lock.wait();
// 访问多个进程共享的资源。
lock.post();
// 只由明确的资源所有者在生命周期结束时销毁。
lock.destroy();5. 信号和退出
被监督服务仍包含第 17 章描述的优雅退出路径。SIGKILL (9) 无法捕获,仅用于 SIGTERM (15) 和宽限期均未完成退出的场景。