守护进程守护自身

守护进程关于守护自身的方法
1 创建子进程循环检测父进程是否退出, 退出的话将父进程拉起来
2 父进程设置sigset(SIGCHLD, &sighandler) 子进程退出在这里进行处理重新拉起子进程
sigset(SIGCHLD, &sighandler);
ret = dmnDmn();

sighandler

void sighandler(int sig) 
{
    pid_t   pd;
    int     ret;

    BASLOG(LOG_LEVEL_DEBUG,"sighandler begin sig[%d]", sig);

    pd = wait(0);

    //守护的守护子进程死亡
    if (g_dmnPid == pd)
    {
        usleep(50000);
        ret = dmnDmn();
        if (FAILURE == ret) 
        {
            BASLOG(LOG_LEVEL_ERROR,"调用dmnDmn失败");
        }
    } 
    else 
    {
        BASLOG(LOG_LEVEL_ERROR,"死亡进程非dmnDmn!");
    }

    BASLOG(LOG_LEVEL_DEBUG,"sighandler end sig[%d]", sig);

}

dmnDmn

int dmnDmn()
{    
    int     pFork;
    pid_t   pPid;

    pFork = fork();

    if (0 == pFork) 
    {
        //子进程操作 getpid getppid
        BASLOG(LOG_LEVEL_DEBUG,"dmnDmn 子进程操作 getpid[%d]", getpid());

        /* 循环检查父进程 */
        while (1)
        {
            pPid = getppid();

            /* 若父进程死亡,重启进程父进程 */
            if (1 == pPid) 
            {
                execv(gsExecPath[0], gsExecPath);
                BASLOG(LOG_LEVEL_ERROR,"重启守护进程失败");
            }

            /* 可配 */
            usleep(50000);
        }
    }

    //父进程操作

    /* 保存 守护功能的子进程 的进程号 */
    g_dmnPid = pFork;

    BASLOG(LOG_LEVEL_DEBUG,"dmnDmn 父进程操作 g_dmnPid[%d]", g_dmnPid);

    return SUCCESS;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值