完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
Windows API ---- WatchDog
Watch Dog 完整名称其实是Watch Dog Timer, 其主要功能是单片机发生软件故障时,通过使器件复位来复位单片机,防止程序受到某种干扰导致程序跑飞。 其实质上是一个计数器,通常会有一个喂狗端,程序正常工作时,每隔一段时间就会输出一个信号到喂狗端,将计数清零,超过规定时间没有喂狗(常指程序跑飞),计数器就会超过阈值,此时给出一个复位信号,使计数强制复位,防止死机。 (本想举个例子来着,可惜想了许久没想到比较合适的例子,就不举了) Point 本例使用Windows API(《windows.h》),编写了简单的双端窗口程序监听器,重点来了,不,还有,在来说代码之前,讲一下实现。本例实现的是两个窗口相互监听彼此进程状态,如果其中一个程序down掉,就尝试重连,超时就重新启动另一个程序,这个状态是双向的。此处使用***共享内存***实现进程通信(当然也可以使用其他方法,但鉴于本例是单机中的两个程序,故使用***共享内存***速度比较快。 Code 1、保证只生成一个进程实例 HANDLE h_mutex_another = CreateMutex(NULL, TRUE, L“another”); auto h_exist = GetLastError(); if (h_mutex_another) { if (ERROR_ALREADY_EXISTS == h_exist) { CloseHandle(h_mutex_another); return 0; } } else { CloseHandle(h_mutex_another); return 0; } 2、使用信号,保证程序退出时,释放掉已经产生的资源 signal(SIGINT, sig_abort); 3、共享内存实现 // 打开共享文件句柄(如果你希望另一个内存也可以实现监视,使用CreateXXX,否则可以使用OpenXXX) 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(); // 此处用来获得异常,如果文件打开失败使用此方法获得异常代码 4、读写临界资源(你当然不希望读取到的内容不是由自己写入,而是由另一个程序写入) // 我这里放入共享内存的为双方的进程号(PID) auto pid = std::to_string(current_pid); std::cout 《《 “contents:” 《《 buff_one 《《 std::endl; tmp = buff_one; // 在这里使用std::lock_guard实现互斥访问 std::lock_guard《mutex》 lg(mt); strncpy(buff_one, pid.c_str(), BUF_SIZE - 1); buff_one[BUF_SIZE - 1] = ‘ ’; if (pid != tmp && tmp != “”) { // 确定另一个进程仍正常运行亦或已经关闭 the_other_pid = tmp; ct_times = 0; std::this_thread::sleep_for(std::chrono::seconds(3)); } 5、获取另一个进程句柄,杀死对方进程(如果另一个进程非法阻塞的话,就重新启动该进程,模拟置零操作) // 这里获取窗口句柄,需要进程号(PID) 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); 6、重新启动另一个进程 // 创建一个新的进程 is_success = CreateProcess( that_path, NULL, //that_path, NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi); 7、释放资源 UnmapViewOfFile(buff_one); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); CloseHandle(handle_one); CloseHandle(h_mutex_another); |
|
|
|
只有小组成员才能发言,加入小组>>
2555 浏览 0 评论
1153浏览 2评论
752浏览 1评论
506浏览 0评论
269浏览 0评论
436浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-24 21:38 , Processed in 1.296819 second(s), Total 79, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号