給應用程序加裝「看門狗」[轉]
January 9th, 2009 lonkil Visual C++ 發表評論 trackback
//最近比較懶,一直沒更新。by lonkil
今天無意中年到這篇文章,很不錯的主意,就轉過來了。
原文:http://blog.csdn.net/bhw98/
相信大多數的程序員或用戶,
「XXX執行了非法操作,將被關閉。要終止程序,請單擊;
如果這個程序運行在無人值守、需要保持連續工作狀態的場合,
做過一定硬件開發的人都知道,惡劣的工作環境,
「看門狗」的思想,完全可以拿到高級語言編程中來用。
在具體實現上,下面以VC為例說明:
設置子進程為「靜默模式」
在系統初始化部分(CWinApp或main中的開頭),
SetErrorMode(SEM_
啟動子進程
在主進程中,創建子進程並運行。
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory( π, sizeof(pi) );
ZeroMemory( &si, sizeof(si) );
si.cb = sizeof(si);
// Start the child process
if (CreateProcess("work.exe", "", NULL, NULL, FALSE, 0, NULL, NULL, &si, π))
{
// success
… …
}CreateProcess有10個參數,看起來挺嚇人,
監視子進程
定時檢查子進程是否在正常運行。
DWORD GetProcessVersion( DWORD ProcessId);當子進程已經退出時,該函數返回0。
更為「專業」的函數是GetExitCodeProcess,
BOOL GetExitCodeProcess(
HANDLE hProcess, // handle to the process
LPDWORD lpExitCode // termination status
);更進一步的考慮
為增強系統的可靠性,給工作程序加裝「看門狗」,
另一個問題是,如果用戶關閉主進程,如何同時關閉子進程?用TerminateProcess函數固然能結束子進程,但可能會造成內存洩漏等新問題。最好是主進程向子進程發出結束的消息並進行同步,使子進程能夠從容地退出。
再擴展一下,一個主進程可以同時管理多個子進程。典型的例子是利用多塊網卡進行抓包、分析、處理的系統,將每一塊網卡應用與一個子進程綁定,而主進程負責監視所有的子進程的工作。
上面的討論涉及到進程間通信(IPC)問題。解決的辦法有很多,像file mapping, mailslot, pipe, DDE, COM, RPC, clipboard, socket, WM_COPYDATA等都能達到目的,可根據個人喜好和具體情況採用。
"給應用程序加"
- 给应用程序加装“看门狗”[转] « Vc爱好者 v3.0 (在「Google 網頁註解」中檢視)
沒有留言:
張貼留言