Windows API Watch Dog----看门狗(相互监视的两个进程(真源代码))
#define BUF_SIZE 1025
wchar_t share_name_one[] = L"TheMappingOfAdventure"; // 共享内存的名字
bool exit_current_process = false;void sig_abort(int sgl) {switch (sgl) {case SIGINT: {break;}case SIGILL: {break;}case SIGFPE: {break;}case SIGTERM: {break;}case SIGBREAK: {break;}case SIGABRT: {exit_current_process = true;break;}}
}int main()
{HANDLE h_mutex_another = CreateMutex(NULL, TRUE, L"another");auto h_exist = GetLastError();if (h_mutex_another) {if (ERROR_ALREADY_EXISTS == h_exist) {std::cout << "this instance has existed.\n";CloseHandle(h_mutex_another);return 0;}}else {std::cout << "Create mutex error, exists.\n";CloseHandle(h_mutex_another);return 0;}signal(SIGINT, sig_abort);/*signal(SIGILL, sig_abort);signal(SIGFPE, sig_abort);signal(SIGTERM, sig_abort);signal(SIGBREAK, sig_abort);signal(SIGABRT, sig_abort);*/auto current_pid = GetCurrentProcessId();wchar_t that_path[] = L"D:\\Project\\C++Proj\\adventure\\Debug\\adventure.exe";char* buff_one = (char*)malloc(BUF_SIZE * sizeof(char));std::mutex mt;// 打开共享文件句柄HANDLE handle_one = CreateFileMapping(INVALID_HANDLE_VALUE, // 物理文件句柄NULL, // 默认安全级别PAGE_READWRITE, // 可读可写0, // 高位文件大小BUF_SIZE, // 地位文件大小share_name_one // 共享内存名称);buff_one = (char*)MapViewOfFile(handle_one, // 共享内存的句柄FILE_MAP_ALL_ACCESS, // 可读写许可0,0,BUF_SIZE);auto err = GetLastError();STARTUPINFO si = { sizeof(si) };PROCESS_INFORMATION pi = PROCESS_INFORMATION();int ct_times = 0; std::string tmp;std::string the_other_pid;bool is_success = false;while (!exit_current_process){auto pid = std::to_string(current_pid);std::cout << "current id:" << current_pid << std::endl;//getchar();if (strlen(buff_one) != 0)std::cout << "contents:" << buff_one << std::endl;tmp = buff_one;std::lock_guard<mutex> lg(mt);strncpy(buff_one, pid.c_str(), BUF_SIZE - 1);std::cout << "tmp:" << tmp << std::endl;buff_one[BUF_SIZE - 1] = '\0';if (pid != tmp && tmp != "") {the_other_pid = tmp;ct_times = 0;std::cout << "the other is still alive\n";std::this_thread::sleep_for(std::chrono::seconds(3));}else{if (ct_times >= 3) {int other_pid = std::atoi(the_other_pid.c_str());HANDLE the_other = OpenProcess(PROCESS_ALL_ACCESS,TRUE,other_pid);TerminateProcess(the_other, 0);CloseHandle(the_other);ct_times = 0;pi.dwProcessId = 0;}if (pi.dwProcessId != 0) {++ct_times;std::cout << "attempt reconnect:" << ct_times << std::endl;std::this_thread::sleep_for(std::chrono::seconds(3));continue;}std::cout << "the other is down\n";is_success = CreateProcess(that_path,NULL,NULL, NULL,TRUE,CREATE_NEW_CONSOLE,NULL, NULL,&si, &pi);if (is_success) {std::cout << pi.dwProcessId << "launch success\n";}elsestd::cout << "fault\n";std::this_thread::sleep_for(std::chrono::seconds(3));}}UnmapViewOfFile(buff_one);CloseHandle(pi.hProcess);CloseHandle(pi.hThread);CloseHandle(handle_one);CloseHandle(h_mutex_another);return 0;
}
附录:
源代码解析:https://blog.csdn.net/weixin_38374997/article/details/103124829
注重版权,转载请标明出处
Windows API Watch Dog----看门狗(相互监视的两个进程(真源代码))相关推荐
- Windows API Watch Dog----看门狗(相互监视的两个进程)
Windows API ---- WatchDog Watch Dog 完整名称其实是Watch Dog Timer, 其主要功能是单片机发生软件故障时,通过使器件复位来复位单片机,防止程序受到某 ...
- Redisson里的“看门狗”居然有这两个“bug”?
大家好! 提到分布式锁,大家一般都会想到 Redis. 想到 Redis,一部分同学会说到 Redisson. 那么说到 Redisson,就不得不掰扯掰扯一下它的"看门狗"机制 ...
- redis 分布式锁 看门狗_redis分布式锁原理及实现
一.写在前面 现在面试,一般都会聊聊分布式系统这块的东西.通常面试官都会从服务框架(Spring Cloud.Dubbo)聊起,一路聊到分布式事务.分布式锁.ZooKeeper等知识. 所以咱们这篇文 ...
- 【嵌入式系统】独立看门狗原理+看门狗实验分析
[嵌入式系统]独立看门狗原理+看门狗实验分析 1.看门狗模块概述 在由单片机构成的微机系统中,由于单片机工作常常会受到来自外界电磁场干扰导致程序跑飞,陷入死循环--即程序正常运行被打断,系统无法继续工 ...
- MSP430F5529 DriverLib 库函数学习笔记(十四)看门狗定时器 (WDT)
目录 硬知识 看门狗定时计数器 (WDTCNT) 看门狗模式 定时计数模式 看门狗定时器中断 时钟故障保护功能 低功耗模式下的看门狗操作 看门狗定时器控制寄存器 WDT_A API (机翻) 参数 上 ...
- 独立看门狗和窗口看门狗的区别
独立看门狗(IWDG--Independent watchdog):使用外部的的时钟,芯片的主频不工作了也能正常工作.只有喂狗时间的上限,没有下限.即如果上限是1s,只需在1s内喂狗看门狗就正常,两次 ...
- 模拟看门狗如何实现?
关注.星标公众号,不错过精彩内容 作者:逸珺 转自:STM32 对于看门狗大家或许不陌生,但对于模拟看门狗有的朋友可能就不甚了解了.本文来聊聊模拟看门狗,旨在梳理相应的概念,理解模拟看门狗原理.与常规 ...
- ESP32任务看门狗实践
默认情况下,TWDT(任务看门狗) 将监视每个 CPU 的空闲任务,但任何任务都可以选择由 TWDT 监视.每个观察任务必须定期"重置" TWDT 以指示它们已被分配 CPU 时间 ...
- # 软件stm32cubeIDE下配置STM32F103的独立看门狗iwdg-学习笔记-基础样例
# 软件stm32cubeIDE下配置STM32F103的独立看门狗iwdg-学习笔记-基础样例 (1)叙述 (2)环境说明 (3)学习流程说明 (1)了解网上资料 (2)查找手册 (3)测试逻辑说明 ...
最新文章
- JavaScript(3)之——对象的属性描述符
- 每日一皮:叫你们别上泰坦尼克,嗓子都喊哑了!没一个听我的,最后还把我......
- but no declaration can be found for element #39;aop:aspectj-autoproxy#39;.
- Linux Shell 编程学习总结
- 全球及中国胶原蛋白肠衣行业深度分析及投资战略规划报告2022-2028年版
- 收集一些非常实用的Linux命令
- [Leedcode][JAVA][第1248题][统计「优美子数组][找规律]
- springmvc 1
- android融云监听消息,关于android:融云-IMkit-拦截或监听所有发送消息
- 通向架构师的道路(第八天)之weblogic与apache的整合与调优 转
- I2C 总线协议初探 - STM32 I2C 接口外设学习笔记
- python模拟火车订票系统_毕业论文:火车票网上订票系统
- KPEG123压电蜂鸣器驱动电路
- ps怎么缩放图层大小_PS怎么快速修改图层大小|Adobe Photoshop CS6图层大小尺寸调整--系统之家...
- MySQL--查询5天之内过生日的同事中的闰年2月29日问题的解决过程
- 一次WTS-WAF绕过
- 「经济/商学/理财」简说
- Nginx之13运筹帷幄 - (VeryNginx)
- 微信朋友圈图片处理策略
- JAVA之HttpClient+Jsoup实现代理IP爬虫