Linux编程之《看门狗进程》
Intro
当我们编写服务器代码时,为了让自己的服务器在意外崩溃时能够及时的重启,软件看门狗就显示出它的作用了,该看门狗进程是通过fork一个子进程(业务进程),父进程一旦捕获到了子进程的结束信号就重新再fork一个子进程来实现的,下面将完整代码贴上。
/************************************************
* 该例程讲解Linux软件看门狗的优雅编写方法
*
* 编写WatchDog有很多种方式:
* a.一个WatchDog.sh脚本程序
* b.一个WatchDog.exe可执行程序
* c.一个可执行程序里面包含WatchDog
*
* 本例程就是使用的c方式,通过父进程监控子进程的运行状态来实现的
* 其中父进程就是子进程(具体的任务进程)的WatchDog
************************************************/
#include <unistd.h>
#include <signal.h>
#include <sys/wait.h>
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
void childProcessFunc()
{
int i = 0;
while (true)
{
++i;
printf("i: %d, pid: %d, ppid: %d\n", i, getpid(), getppid());
if (i == 10)
{
// 子进程主动结束
//exit(0);
char* p = NULL;
*p = 1;
}
sleep(1);
}
}
void forkChildProcess(int)
{
int status = 0;
// 等待子进程中断或终止,释放子进程资源
// 否则死掉的子进程会变成僵尸进程
int pid = wait(&status);
if (pid < 0)
{
printf("error: %s\n", strerror(errno));
return;
}
// 如果子进程是由于某种信号退出的,捕获该信号
if (WIFSIGNALED(status))
{
int signalNum = WTERMSIG(status);
printf("Child process was killed by signal num: %d\n", signalNum);
}
// 检测是否生成了core文件
if (WCOREDUMP(status))
{
printf("Child process core dump file generated\n");
}
// 等待3秒钟重新启动子进程
sleep(3);
pid = fork();
if (pid == 0)
{
printf("Fork new child process\n");
childProcessFunc();
}
}
bool initWatchDog()
{
int pid = fork();
if (pid)
{
// 父进程一直监视子进程的运行状态
while (true)
{
// 捕获子进程结束信号
assert(signal(SIGCHLD, forkChildProcess) != SIG_ERR);
// 父进程挂起,当有信号来时被唤醒
pause();
}
}
else if (pid < 0)
{
return false;
}
return true;
}
int main()
{
printf("Main pid: %d\n", getpid());
// 初始化看门狗进程
bool ret = initWatchDog();
if (!ret)
{
printf("Init watch dog failed\n");
return 1;
}
printf("Init watch dog success...\n");
// 运行子进程代码
childProcessFunc();
return 0;
}
该例子的github地址:https://github.com/chxuan/samples/blob/master/WatchDog/WatchDog.cpp
Linux编程之《看门狗进程》的更多相关文章
- Linux编程之《守护进程》
Intro ----- 守护进程,也就是通常说的Daemon进程,是Linux中的后台服务进程.它是一个生存期较长的进程,通常独立于控制终端并且周期性地执行某种任务或等待处理某些发生的事件.守护进程常 ...
- Linux编程 7 (实时监测进程 top, 结束进程kill,killall)
一. 实时监测进程 top 在一篇里讲到ps命令在收集进程信息时非常有用,但它只能显示某个特定时间点的信息.想要观察那些频繁换进换出的内存进程趋势,用top命令是合适的.使用top命令如下图所示: 在 ...
- 10.3、android输入系统_必备Linux编程知识_任意进程双向通信(scoketpair+binder)
3. 任意进程间通信(socketpair_binder) 进程每执行一次open打开文件,都会在内核中有一个file结构体表示它: 对每一个进程在内核中都会有一个task_struct表示进程,这个 ...
- Linux 下如何使用看门狗
Linux内核有集成WD的选项.将其使能后,系统里就会有watchdog的设备驱动:/dev/watchdog.这样,在应用程序里只需打开这个设备使用即可:#include <fcntl.h ...
- Linux 软件看门狗 watchdog 喂狗
Linux 自带了一个 watchdog 的实现,用于监视系统的运行,包括一个内核 watchdog module 和一个用户空间的 watchdog程序.内核 watchdog 模块通过 /dev/ ...
- 【目录】linux 编程
随笔分类 - linux 编程 Linux编程 24 shell编程(结构化 if [ condition ] 数值比较,字符串比较) 摘要: 一.概述 接着上篇讲的结构化命令,最后讲到了test命令 ...
- linux设备驱动归纳总结(十一):写个简单的看门狗驱动【转】
本文转载自:http://blog.chinaunix.net/uid-25014876-id-112879.html linux设备驱动归纳总结(十一):写个简单的看门狗驱动 xxxxxxxxxxx ...
- linux内核中断之看门狗
一:内核中断 linux内核中的看门狗中断跟之前的裸板的中断差不多,在编写驱动之前,需要线把内核自带的watch dog模块裁剪掉,要不然会出现错误:在Device Drivers /Watchdog ...
- Linux C语言编程学习笔记 (1)进程控制入门
想进行Linux系统开发已经很久了,一直没有付诸实践.今日终于开始学习Linux下的C语言编程,研究一天,终于大概弄明白了Linux系统进程管理的一些基本概念和编程方法,总结下来以方便大家学习和自己实 ...
随机推荐
- Having the Result Set of a Stored Proc Sent to You by RSS Feed.
Having the Result Set of a Stored Proc Sent to You by RSS Feed. by JBrooks 14. 十二月 2010 12:44 I wa ...
- js混淆工具
1\ http://www.jasob.com 2\ http://developer.yahoo.com/yui/compressor
- 调试Python代码的工具
pdb: 首先来说Python里内建的调试器,pdb.它利用一个简单的命令行界面,还有很多你在用调试器时用得上的功能.帮助系统能为你指出你能运行的命令,比如单步调试代码,操纵调用栈和设置断点. 一些它 ...
- 第三百四十六天 how can I 坚持
徐斌的电脑来了,thinkpad,感觉还好,电脑也就这样,联想..不好说,不做评论,末日王者吧. 为什么写博客tab键不管用了呢. 下午又去奥体跑了一圈,好累,刚跑完腿疼,现在还好. 还没洗澡呢,都这 ...
- 2 weekend110的HDFS的JAVA客户端编写 + filesystem设计思想总结
HDFS的JAVA客户端编写 现在,我们来玩玩,在linux系统里,玩eclipse 或者, 即,更改图标,成功 这个,别慌.重新换个版本就好,有错误出错是好事. http://www.eclips ...
- Kali Linux 安装教程-转
rootoorotor昨天折腾了 Kali Linux 1.0,把大概的配置过程记录下来,希望对想接触或使用Kali Linux的同学有所帮助. 请注意: 1.本文为面向新手的教程,没技术含量,没 ...
- Hadoop概念学习系列之分布式数据集的容错性(二十七)
一般来说,分布式数据集的容错性有两种方式: 1.数据检查点 2.记录数据的更新 我们面向的是大规模数据分析,数据检查点操作成本很高:需要通过数据中心的网络连接在机器之间复制庞大的数据集,而网络带宽往往 ...
- 研究QGIS二次开发笔记(一)
为了在QT程序中嵌入一个地图,最终选择了QGIS来干这件事.选型阶段真是呵呵.我折腾的是QGIS2.4.0. 首先,到官方网站下载安装QGIS.如果你跟我一样懒的话,可能希望下载一个已经编译好的win ...
- 显示MYSQL数据库信息
显示所有的数据库:show databases 显示一个数据库所有表用:show tables from DatabaseName SELECT table_name FROM information ...
- jsp转发action的问题找不到acton
-----------------------------jsp转发action的问题找不到acton------------------------------------------- jsp: ...