當前位置:首頁 > 芯聞號 > 充電吧
[導讀]一.概述一些重要的程序,必須讓它一直跑著;而且還要時時關心它的狀態(tài)——不能讓它出現(xiàn)死鎖現(xiàn)象。當然,如果一個主程序會出現(xiàn)死鎖,肯定是設計或者編程上的失誤。我們首要做的事是,把這個Bug揪出來。但如果時間

一.概述
一些重要的程序,必須讓它一直跑著;而且還要時時關心它的狀態(tài)——不能讓它出現(xiàn)死鎖現(xiàn)象。當然,如果一個主程序會出現(xiàn)死鎖,肯定是設計或者編程上的失誤。我們首要做的事是,把這個Bug揪出來。但如果時間緊迫,這個Bug又“飄忽不定”,那么,我們還是先寫一個“看門狗”,暫時應一下急吧。

“看門狗”的需求描述:“看門狗”的運行不出現(xiàn)界面窗口,具有一定的隱蔽性;定時判斷目標進程是否運行在當前系統(tǒng)中,如果沒有則啟動目標進程;判斷目標進程是否“沒有響應”,如果是則終止目標進程;如果目標進程“沒有響應”的次數(shù)超過一定的數(shù)量,則將計算機系統(tǒng)重啟。

二.預備知識
首先要介紹兩個主要的函數(shù),能夠判斷目標進程是否“沒有響應”。在User32.dll中(沒有文檔公開),Win2k/NT下的IsHungAppWindow和Win9X下的IsHungThread;前者是以一個窗口句柄作為參數(shù),后者是以線程ID作為參數(shù)。我們可以通過VC開發(fā)工具的Depends查到這兩個函數(shù)。
要使用這兩個函數(shù),我們必須先動態(tài)導入,如下:
if (m_hUser32 == NULL)
{
??? m_hUser32 = GetModuleHandle("USER32.DLL");
}
if (m_hUser32)
{
??? m_IsHungNT? = (HUNG_FUNNT) GetProcAddress(m_hUser32, "IsHungAppWindow");
??? m_IsHung9X? = (HUNG_FUN9X) GetProcAddress(m_hUser32, "IsHungThread");
}
另外,還有如下知識點:
1.??? 如何讓窗口隱藏(當然通過Windows任務管理器還是可以看到的)
在框架窗口類的PreCreateWindow中修改窗口風格,如下:
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
??? if( !CFrameWnd::PreCreateWindow(cs) )
??????? return FALSE;
??? // TODO: Modify the Window class or styles here by modifying
??? //? the CREATESTRUCT cs

??? cs.dwExStyle |= WS_EX_TOOLWINDOW;? // Make invisible in taskbar
??? cs.style????? = WS_POPUP;????????? // Hide the main window

??? return TRUE;
}


2.??? 如何讓“看門狗”只運行一個進程
使用互斥量。在CWatchDogApp::InitInstance()中,執(zhí)行如下代碼:
bool CWatchDogApp::IsUniqueCopyInProc()
{
??? m_Mutex = CreateMutex(NULL, TRUE, "System Watch Dog");
??? if (GetLastError() == ERROR_ALREADY_EXISTS)
??? {
??????? return false;
// 本文轉自 C++Builder 研究 -?http://www.ccrun.com/article.asp?i=546&d=b7r01j
??? }
??? return true;
}
該函數(shù)如果返回false,說明已經有一個WatchDog進程在運行了,當前進程就沒有必要再執(zhí)行下去了。在InitInstance如下處理:
if (!IsUniqueCopyInProc())
return FALSE;


3.??? 如何判斷當前操作系統(tǒng)類型
bool CWatchDogApp::IsWinNT()
{?
??? OSVERSIONINFO OSVersionInfo;
??? OSVersionInfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
??? GetVersionEx(&OSVersionInfo);?
??? if (OSVersionInfo.dwPlatformId == VER_PLATFORM_WIN32_NT)
??? {
??????? return true;
??? }
??? return false;
}


4.??? 如何自動重啟計算機
在Win9x和Win2k/NT下,重啟計算機的處理略有不同:
if (theApp.IsWinNT())
{
??? // 在Win NT/2000下賦予關閉系統(tǒng)的權限
??? static HANDLE hToken;
??? static TOKEN_PRIVILEGES tp;
??? static LUID luid;
::OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, &hToken ) ;
??? ::LookupPrivilegeValue( NULL, SE_SHUTDOWN_NAME, &luid );
??? tp.PrivilegeCount?????????? = 1;
??? tp.Privileges[0].Luid?????? = luid;
??? tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
??? ::AdjustTokenPrivileges( hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), NULL, NULL );
??? return ::ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0);
}
else
{
??? return ::ExitWindowsEx(EWX_REBOOT | EWX_FORCE, 0);
}


5.??? 如何啟動、結束其他進程
啟動進程用CreateProcess,終止進程用TerminateProcess。參考代碼如下:
bool CWatchDogView::RunTheSysProc()
{
??? char??? szPath[MAX_PATH];
??? GetModuleFileName(NULL, szPath, MAX_PATH);
??? CString strPath = szPath;
??? strPath = strPath.Left(strPath.ReverseFind('\')) + "\HungDemo.exe";

??? STARTUPINFO??????????? StartInfo;
??? PROCESS_INFORMATION??? procStruct;
??? memset(&StartInfo,0,sizeof(STARTUPINFO));
??? StartInfo.cb = sizeof(STARTUPINFO);

??? if (!::CreateProcess(
??????? (LPCTSTR) strPath,
??????? NULL,
??????? NULL,
??????? NULL,
??????? FALSE,
??????? NORMAL_PRIORITY_CLASS,
??????? NULL,
??????? NULL,
??????? &StartInfo,
??????? &procStruct))
??????? return false;
??? return true;
}
需要提醒的是,TerminateProcess是在萬不得已的情況下使用的,它不會進入進程使用的DLL的入口點通知“脫離”(Detaching)狀態(tài)。有時候,這樣做是很危險的(DLL內部的全局數(shù)據(jù)可能受影響較大)。


6.定時檢測子進程的運行情況代碼如下:
void CWatchDogView::OnTimer(UINT nIDEvent)?
{
?// Get the target window handle
?HWND??? hTarget = ::FindWindow(NULL, "抄表數(shù)據(jù)庫維護");
?DWORD?? dwProcessID, dwThreadID;
?dwThreadID = ::GetWindowThreadProcessId(hTarget, &dwProcessID);
?
?// The Target window found, the verify the whether responding
?if (hTarget)??
?{
??//這里我處理得簡單了一點,源程序還加了重新啟動機器等處理
??}
?else
?{???????
??//如果沒有檢測到所監(jiān)視的子進程在運行,則重新啟動子進程(也就是自己想要被監(jiān)視的程序)
??RunTheSysProc();
?????????????????
?}?

?CView::OnTimer(nIDEvent);
}

7.??? 如何讓Win2k/NT自動登錄
修改注冊表。在HKEY_LOCAL_MACHINE目錄下的SoftwareMicrosoftWindows NT CurrentVersionWinLogon下的AutoAdminLogon(字符串型)設置成1,并在DefaultUserName設置默認登錄用戶,DefaultPassword設置默認用戶的密碼。

8.??? 如何讓Win2k/NT登錄成功后直接執(zhí)行你的程序(而不是默認的文件瀏覽器)
修改注冊表。在注冊表HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NT CurrentVersionWinlogonShell的值從原先的explorer.exe修改為自己程序的絕對路徑。

三.功能演示(Win2k/NT下)
友情提醒:開始演示之前,請先將你目前的工作保存。運行“看門狗”WatchDog;同時使用Ctrl+Alt+Del打開“Windows任務管理器”。稍候片刻,可以看到目標程序HungDemo會被啟動(這個程序模擬了“沒有響應”)。然后,WatchDog發(fā)現(xiàn)這個程序“沒有響應”,則把它殺掉,然后重新啟動一個新的HungDemo進程。如此的處理重復六次以后,系統(tǒng)會自動重啟。


以上是我從網上摘下來的一篇關于軟件看門狗的文章,我只是在原文的基礎上加以修改,以便于像我這樣的初學者更容易理解。對于像我樣的新手來說,其中的很多東西我還是不怎么懂,像GetModuleHandle(),GetProcAddress()之類的函數(shù),我不明白深層次的意思,我也不知道怎么修改注冊表。

????? 其實這些功能我都沒有用,我只用到了讓程序在出錯的情況下能自動重啟。沒有讓機器重啟,因為我覺得如果讓機器重啟的話,可能還會遇到很多問題,比如開機密碼之類的。其實作者講述的已經挺明白的了,按照他的講述加上自己閱讀源程序,相信大家都能把它修改成自己想要的程序。其實,我覺得,要實現(xiàn)看門狗這個功能,最主要的是理解CreateProcess((LPCTSTR)strPath,NULL,NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,&StartInfo,&procStruct))函數(shù)和::FindWindow(NULL, "自己的程序名稱")這兩個函數(shù)。其中,CreateProcess函數(shù)主要是創(chuàng)建一個子進程,就是被看門狗監(jiān)視的那個程序,修改程序時,只要把HungDemo.exe改成自己程序的exe就行了。而::FindWindow函數(shù)主要是用來得到子進程的窗口句柄,以便用來判斷被監(jiān)視的程序是否已經退出。

本站聲明: 本文章由作者或相關機構授權發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內容真實性等。需要轉載請聯(lián)系該專欄作者,如若文章內容侵犯您的權益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或將催生出更大的獨角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉型技術解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術公司SODA.Auto推出其旗艦產品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關鍵字: 汽車 人工智能 智能驅動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務中斷的風險,如企業(yè)系統(tǒng)復雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務連續(xù)性,提升韌性,成...

關鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網易近期正在縮減他們對日本游戲市場的投資。

關鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產業(yè)博覽會開幕式在貴陽舉行,華為董事、質量流程IT總裁陶景文發(fā)表了演講。

關鍵字: 華為 12nm EDA 半導體

8月28日消息,在2024中國國際大數(shù)據(jù)產業(yè)博覽會上,華為常務董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權最終是由生態(tài)的繁榮決定的。

關鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應對環(huán)境變化,經營業(yè)績穩(wěn)中有升 落實提質增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務引領增長 以科技創(chuàng)新為引領,提升企業(yè)核心競爭力 堅持高質量發(fā)展策略,塑強核心競爭優(yōu)勢...

關鍵字: 通信 BSP 電信運營商 數(shù)字經濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術學會聯(lián)合牽頭組建的NVI技術創(chuàng)新聯(lián)盟在BIRTV2024超高清全產業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術創(chuàng)新聯(lián)...

關鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關鍵字: BSP 信息技術
關閉
關閉