守护进程关于守护自身的方法
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;
}