Linux平台C++监控子进程程序

本文介绍了在Linux平台上,使用C++实现一个主进程监控子进程的方案,以确保服务异常时能自动重启。重点包括子进程接收到终止信号后的善后处理,父进程如何回收子进程资源及启动新子进程,以及父进程终止时如何通知并等待子进程结束。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、问题描述

有时候服务端程序会偶现异常停止,这个时候除了要查找程序的bug外,还有拉起程序以继续提供服务。目前为了方便,我们直接用shell脚本去监控服务进程,这种方法比较简单,不再赘述。这里描述另一种方法:服务进程分离为主监控进程和子工作进程,主进程只负责监控子进程(停止、拉起子进程等),子进程负责对外提供服务。

监控子进程的程序,个人认为重点如下:

  1. 子进程收到终止信号后,完成自身善后工作,然后直接调用exit()终止。
  2. 父进程收到子进程终止的信号后,先调用waitpid()回收子进程的资源,避免僵尸进程,再拉起新的子进程。
  3. 父进程收到终止信号后,首先调用kill()通知子进程终止,然后调用waitpid()等待子进程终止并回收子进程的资源,最后父进程调用exit()终止。

2、程序源码

下面直接贴上代码(直接g++编译即可):

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <string.h>

static sig_atomic_t  reap;
static sig_atomic_t  terminate;

static pid_t master_pid;
static pid_t worker_pid;
static const char* szfilename = "/tmp/my_test_daemon.txt";

void signal_handler(int signo);
void worker(long i);
void init_signals();
void start_worker_processes();
bool start_daemon();

typedef struct {
    int     signo;   //需要处理的信号
    void  (*handler)(int signo);   //收到signo信号后就会回调handler方法
} signal_t;

//指定各种信号的处理函数
signal_t signals[] = {
    {SIGHUP, signal_handler},
    {SIGQUIT, signal_handler},
    {SIGTERM, signal_handler},
    {SIGALRM, signal_handler},
    {SIGINT, signal_handler},
    {SIGIO, signal_handler},
    {SIGCHLD, signal_handler},
    {SIGSYS, SIG_IGN},
    {SIGPIPE, SIG_IGN},
    {
  
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值