守护进程守护自身
2016-12-16 16:49
274 查看
守护进程关于守护自身的方法
1 创建子进程循环检测父进程是否退出, 退出的话将父进程拉起来
2 父进程设置sigset(SIGCHLD, &sighandler) 子进程退出在这里进行处理重新拉起子进程
sighandler
dmnDmn
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; }
相关文章推荐
- 分享几个不错的博客
- jstorm rebalance动态调整Task和Worker
- Apache 常用包
- Javascript中typeof instanceof constructor的区别
- loadrunner 关联
- 事件分发机制
- Hibernate 的三种查询方式:HQL、Criteria、Sql
- Spring的IOC原理[通俗解释一下]
- [LintCode]图是否是树
- 1066. Root of AVL Tree (25)
- VMwareWorkstation12+CentOS+xshell搭建Hadoop运行环境
- 如何在CentOS 7上安装MySQL
- Swift 闭包 (oc 的block 类似)
- nginx 根据IP 进行灰度发布
- Subsets vs Permutations
- com.sun.xml.internal.org.jvnet.mimepull.MIMEParsingException: Reached EOF, but t
- Python复习之下划线的含义
- 使用Nutch和Solr抓取并索引网页
- 数据库存储过程
- Primer Plus第二章总结