您的位置:首页 > 其它

守护进程守护自身

2016-12-16 16:49 274 查看
守护进程关于守护自身的方法

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息