用c/c++编的程序, 有时会因为某种错误而终止, 如果我们希望终止了也能及时重启. 那么可以考虑monitor/worker模式.
父进程作为monitor, 子进程作真实的工作, 每次子进程终止的时候, monitor通过wait得知, 然后重新fork一个工作子进程, 当monitor被信号杀死的时候, 则杀掉子进程, 唯一的问题是当monitor 被SIGKILL杀死的时候, 无法添加信号回调函数, 也就无法杀掉子进程.
/**
* Monitor to respawn a working process
*/
bool terminating = false;
pid_t child_pid = 0;
// This function will be called on calling exit() or return of main()
static void on_monitor_exit()
{
if(child_pid != 0) {
terminating = true;
kill(child_pid, SIGINT);
}
}
static void stop_monitor(int v) {
if(child_pid != 0) {
// Send sigint to child worker
terminating = true;
kill(child_pid, SIGINT);
} else {
exit(128+v); // 128 + signal is the default exit status on signal
}
}
static void reload(int v) {
// doesnot terminate monitor, restart child instead
if(child_pid != 0) {
kill(child_pid, SIGINT);
} else {
exit(128+v); // 128 + signal is the default exit status on signal
}
}
int main(int argc, char ** argv) {
static bool monitor_initialized = false;
while(!terminating) {
child_pid = fork();
if(child_pid == 0) {
// In child process, do the actual work
return child_run(argc, argv);
} else {
if(!monitor_initialized) {
signal(SIGINT, stop_monitor);
signal(SIGTERM, stop_monitor);
signal(SIGHUP, reload);
atexit(on_monitor_exit);
monitor_initialized = true;
}
// Wait for child return
int child_status;
pid_t pid = wait(&child_status);
if(pid != child_pid) {
break;
}
}
}
// Monitor stops
}
分享到:
相关推荐
UNIX Linux程序设计教程,使用C/C++进行开发,有兴趣的各位可以看看
UNIX下调试程序 UNIX下调试程序 UNIX下调试程序 UNIX下调试程序
精通 LINUX & UNIX Shell 程序设计.pdf
Unix程序设计详细PPT和复习资料 很全面专业
这本书是非常经典的程序设计书籍,对于linux学习者来说是非常有用的,可以说是必读经典
本资料分成“上篇 UNIX编程指南”、“下篇 DEC C广语言参考”。本资料内容新颖详实、示例丰富、技术含量高、指导性强,是UNIX开发与编程人员、系统管理与维护人员、技术支持人员的珍藏的必备资料。
unix中last命令的实现unix中last命令的实现unix中last命令的实现unix中last命令的实现unix中last命令的实现
GDB是GNU开源组织发布的一个强大的UNIX下的程序调试工具。或许,各位比较喜欢那种图形界面方式的,像VC、BCB等IDE的调试,但如果你是在UNIX平台下做软件,你会发现GDB这个调试工具有比VC、BCB的图形化调试器更强大的...
本书是关于unix程序设计教程,很适合初学者阅读,有需要的可以看看。
Unix程序设计艺术 pdf the art of unix programming
UNIX系统程序设计实验指导.doc
主要介绍shell(即Bourne shell)的语法结构、各种变量定义及赋值引用、各种标点符号、控制语句等
unix环境下的线程库实现,包含若干个重要函数,是大学学习unix环境高级编程必备的题目。
2.在linux中实现一个简单的命令解释程序,功能要求: 1)同时支持内部命令和外部命令,内部命令支持两个(cd、exit) 2)支持后台命令 提示:实验中可能用到的系统调用如下: • fork() — 创建一个新进程 • ...
UNIX和Shell程序设计权威教程pdf
经典的UNIX程序例子!!!!!!!!!!!!
北邮 UNIX课程课件 第二章 基本UNIX使用程序
Unix环境下C语言程序编译与调试的最基本指导。
unix程序设计教程 12部分之10 unix程序设计教程 12部分之10
这份资料对于学习unix开发有很好的帮助,里面有基本的命令使用,以及潜移默化的讲解unix开发