#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----看门狗(相互监视的两个进程(真源代码))相关推荐

  1. Windows API Watch Dog----看门狗(相互监视的两个进程)

    Windows API ---- WatchDog Watch Dog ​ 完整名称其实是Watch Dog Timer, 其主要功能是单片机发生软件故障时,通过使器件复位来复位单片机,防止程序受到某 ...

  2. Redisson里的“看门狗”居然有这两个“bug”?

    ​大家好! 提到分布式锁,大家一般都会想到 Redis. 想到 Redis,一部分同学会说到 Redisson. 那么说到 Redisson,就不得不掰扯掰扯一下它的"看门狗"机制 ...

  3. redis 分布式锁 看门狗_redis分布式锁原理及实现

    一.写在前面 现在面试,一般都会聊聊分布式系统这块的东西.通常面试官都会从服务框架(Spring Cloud.Dubbo)聊起,一路聊到分布式事务.分布式锁.ZooKeeper等知识. 所以咱们这篇文 ...

  4. 【嵌入式系统】独立看门狗原理+看门狗实验分析

    [嵌入式系统]独立看门狗原理+看门狗实验分析 1.看门狗模块概述 在由单片机构成的微机系统中,由于单片机工作常常会受到来自外界电磁场干扰导致程序跑飞,陷入死循环--即程序正常运行被打断,系统无法继续工 ...

  5. MSP430F5529 DriverLib 库函数学习笔记(十四)看门狗定时器 (WDT)

    目录 硬知识 看门狗定时计数器 (WDTCNT) 看门狗模式 定时计数模式 看门狗定时器中断 时钟故障保护功能 低功耗模式下的看门狗操作 看门狗定时器控制寄存器 WDT_A API (机翻) 参数 上 ...

  6. 独立看门狗和窗口看门狗的区别

    独立看门狗(IWDG--Independent watchdog):使用外部的的时钟,芯片的主频不工作了也能正常工作.只有喂狗时间的上限,没有下限.即如果上限是1s,只需在1s内喂狗看门狗就正常,两次 ...

  7. 模拟看门狗如何实现?

    关注.星标公众号,不错过精彩内容 作者:逸珺 转自:STM32 对于看门狗大家或许不陌生,但对于模拟看门狗有的朋友可能就不甚了解了.本文来聊聊模拟看门狗,旨在梳理相应的概念,理解模拟看门狗原理.与常规 ...

  8. ESP32任务看门狗实践

    默认情况下,TWDT(任务看门狗) 将监视每个 CPU 的空闲任务,但任何任务都可以选择由 TWDT 监视.每个观察任务必须定期"重置" TWDT 以指示它们已被分配 CPU 时间 ...

  9. # 软件stm32cubeIDE下配置STM32F103的独立看门狗iwdg-学习笔记-基础样例

    # 软件stm32cubeIDE下配置STM32F103的独立看门狗iwdg-学习笔记-基础样例 (1)叙述 (2)环境说明 (3)学习流程说明 (1)了解网上资料 (2)查找手册 (3)测试逻辑说明 ...

最新文章

  1. JavaScript(3)之——对象的属性描述符
  2. 每日一皮:叫你们别上泰坦尼克,嗓子都喊哑了!没一个听我的,最后还把我......
  3. but no declaration can be found for element #39;aop:aspectj-autoproxy#39;.
  4. Linux Shell 编程学习总结
  5. 全球及中国胶原蛋白肠衣行业深度分析及投资战略规划报告2022-2028年版
  6. 收集一些非常实用的Linux命令
  7. [Leedcode][JAVA][第1248题][统计「优美子数组][找规律]
  8. springmvc 1
  9. android融云监听消息,关于android:融云-IMkit-拦截或监听所有发送消息
  10. 通向架构师的道路(第八天)之weblogic与apache的整合与调优 转
  11. I2C 总线协议初探 - STM32 I2C 接口外设学习笔记
  12. python模拟火车订票系统_毕业论文:火车票网上订票系统
  13. KPEG123压电蜂鸣器驱动电路
  14. ps怎么缩放图层大小_PS怎么快速修改图层大小|Adobe Photoshop CS6图层大小尺寸调整--系统之家...
  15. MySQL--查询5天之内过生日的同事中的闰年2月29日问题的解决过程
  16. 一次WTS-WAF绕过
  17. 「经济/商学/理财」简说
  18. Nginx之13运筹帷幄 - (VeryNginx)
  19. 微信朋友圈图片处理策略
  20. JAVA之HttpClient+Jsoup实现代理IP爬虫

热门文章

  1. 使用Http下载文件并实时显示进度 --转载
  2. Linux之USB分析
  3. 编程时学到的英语单词
  4. java后端和js后端的区别_前端开发和后端开发有什么区别?
  5. 6-Spring Security OAuth2配置项详解
  6. 安卓获取手机型号和刘海屏适配
  7. android刘海屏手机专业术语叫什么,Android刘海屏适配精炼详解
  8. torch.normal()的用法
  9. 玩玩iOS14 Beta系统
  10. 骨传导蓝牙耳机品牌推荐,2022年骨传导蓝牙耳机排名