用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
}
分享到:
相关推荐
### 使用HostMonitor实现运维自动化监控的关键知识点 #### 一、前言与程序介绍 - **HostMonitor**是一款功能强大的IT基础设施监控工具,适用于各种规模的企业。它可以自动化地监控网络设备和服务的状态,帮助管理员...
9. **工具介绍**:市面上有许多知名的数据包分析工具,如Wireshark(开源且功能强大)、Microsoft Network Monitor、Tcpdump(命令行工具,主要在Unix-like系统上使用)等,每款工具都有其特点和适用场景。...
5. **线程与并发**:为了实现持续监控,程序可能采用多线程设计,其中一个线程负责数据采集,另一个线程负责更新界面。 6. **用户界面**:系统可能提供简单的命令行界面或GUI界面,让用户能够交互式查看和控制监控...
**Simple Unix Monitor (SUMON)** 是一个开源项目,专门设计用于监控UNIX和Linux系统的健康状况。SUMON提供了直观的Web界面,使得系统管理员能够轻松地查看和管理他们的服务器集群,确保其性能稳定并能及时发现潜在...
这份文档介绍了一个简单的脚本程序,用于监控特定用户的登录情况。以下是对这个实验内容的详细解释: 1. **shell脚本**: 脚本中的`check_user()`函数是循环执行的,它会每隔5秒检查一次用户登录状态。如果脚本...
3. Microsoft Network Monitor:这是Microsoft提供的网络分析工具,特别适合Windows环境下的网络问题诊断。 三、IP包捕获的应用场景 1. 故障排查:当网络连接出现问题时,可以通过捕获数据包来查找错误根源,例如丢...
Herb Sutter预测,从2007年到2012年,并发程序设计将变得更加普及和简单。在这个变革中,开发者有机会利用新的技术框架,如Executor、Future和Blocking Queue,以及lock-free数据结构来构建并发程序。 **线程模型**...
1. **单线程程序设计**:在单线程环境下,程序按照预定顺序执行,简单易懂,且可预测性强。由于只有一个执行流,所以变量的访问和修改都是有序的,不会出现数据竞争问题。 2. **多进程程序设计**:Unix等操作系统...
关于标签"Shell",这表明`network_monitor`使用的是Shell编程语言,如bash或sh,这种语言广泛用于Unix和Linux系统中,用于编写简单的系统管理任务和自动化流程。Shell脚本通常包含一系列命令行指令,可以读取输入、...
1. **服务代码**:展示了如何定义和实现一个简单的TUXEDO服务。 2. **客户端代码**:演示了如何使用ATMI API调用服务,进行数据交互。 3. **配置文件**:可能包含`tuxconfig`文件,用于设置服务器的启动参数。 4....
在Unix-like操作系统中,守护进程通常在用户登录会话之外运行,避免受到用户退出或终端关闭的影响。为了将一个进程转换为守护进程,我们需要遵循以下步骤: 1. **脱离控制终端**:通过`os.setsid()`创建一个新的...
MiniX提供了对核心操作系统概念的简单实现,便于理解。 1. **内存管理**: - `brk`系统调用:在Unix系统中,`brk`是改变程序数据段结束地址的函数,用于动态分配内存。通过调整堆的边界,`brk`可以扩展或收缩程序...
GDB(GNU Debugger)是GNU开源组织发布的一款强大的Unix下的程序调试工具。由于嵌入式系统资源有限,无法直接在目标系统上运行GDB,所以需要在主机上运行GDB,并在目标系统上运行GDB Server,通过网络连接实现远程...
获取Java线程堆的常见方法是在Unix系统中向JVM发送SIGQUIT信号,这通常可以通过`kill -3 <进程ID>`命令实现。这个操作不会导致应用程序停止,而是生成一个线程堆的输出,帮助开发者了解程序执行的实时状态。 例如,...
DBus是Linux系统中的一种消息总线服务,它允许不同的应用程序之间进行通信,实现了进程间通信(IPC,Inter-Process Communication)。DBus的核心理念是提供一种简单、高效且安全的方式来协调和同步多个运行在相同...
无论是Windows还是Linux/Unix环境下的安装,还是通过Designer或Monitor进行开发和监控,亦或是通过命令行工具进行高级管理操作,都能让使用者更加高效地完成工作任务。希望本指南能够为您的学习之旅提供有价值的参考...
本文将详细介绍如何通过编写一个简单的Shell脚本来实现这一目标。 #### 二、关键知识点解析 ##### 1. **监控脚本的基本结构** - **脚本头部声明**:`#!/bin/sh` 指定了此脚本使用`/bin/sh`作为解释器。 - **变量...
Monit 是一款在 Unix-like 系统中广泛使用的开源监控工具,主要用于监控系统服务、文件、目录、程序以及网络资源的状态。"monit-4.9.tar" 是这个软件的一个特定版本,通常以 tar 归档文件的形式提供,用于在各种 ...
在Windows环境下,使用`FileSystemWatcher`类,我们可以轻松实现文件或目录的监控。首先,需要创建一个`FileSystemWatcher`实例,并配置其属性,如`Path`(要监视的目录)、`Filter`(要监视的特定文件类型)以及`...
第8章 在UNIX与Linux下的特殊调试技术 123 8.1 GDB的基础——ptrace 124 8.1.1 ptrace及其命令 126 8.1.2 GDB对多进程的支持 127 8.1.3 GDB简介 128 8.1.4 跟踪系统调用 131 8.2 用GDB调试二进制文件 133 ...