從CSDN開發高手雜誌上看到應用程式的心跳防護功能。覺得很有用。目前已經試用到實際項目。在試用的過程中,自己也對該功能有了更深的瞭解。在此把自己對該部分的瞭解記錄下來,希望對後來者能夠提供協助。
心跳防護程式的功能及使用方法
心跳防護程式的作用心跳防護程式用於實現無人值守的程式的自維護功能,使得被防護程式由於某種異常而導致崩潰時可以自動重新啟動,滿足無人值守的環境要求。心跳防護程式適用於那些需要無人值守,長期運行,但程式由於不確定性因素有出現崩潰的可能。說明:本程式不是用來防護代碼品質差的程式的。
心跳防護程式的組成心跳防護程式由兩部分組成。分別用於心臟跳動和心臟恢複。第一部分為心跳計數模組,需要植入被防護程式中,作為程式的心臟。當程式運行正常時,心跳計數也會正常進行。該模組以動態庫形式發布。提供心跳啟動和心跳終止兩個介面。第二部分為心跳恢複模組。由心跳計數模組啟動,監控被防護程式的運行狀態,當發現被防護程式運行異常時,刪除已存在的進程,重新啟動被防護程式,實現心跳繼續。該模組以應用程式形式存在。
心跳防護程式的原理 心跳防護程式的核心是在心臟跳動和心臟恢複兩個模組之間建立一個訊號量。心臟跳動模組負責給訊號量增值,心臟恢複模組負責給訊號量減值。增減值採用同一頻率(每秒一次)。當心臟跳動正常時,訊號量的值基本保持不變。如果心臟跳動異常(比如程式崩潰),訊號量將不增加。心臟恢複模組通過減值可以偵測到訊號量為0,此時認為被防護程式已出現問題,刪除被防護程式的已有進程(通過進程名稱),然後重新啟動新程式。這樣就可以保持被防護程式的持續運行。
心跳防護程式的使用需要將心跳計數模組引入被防護程式。心跳計數模組為動態庫,名為HeartBeat.dll。需要在被防護程式中包含HeartBeat.lib,並引入HeartBeat.h檔案。本動態庫包含兩個介面函數,分別為:啟動心跳函數:StartHeartBeat((char * pszProgamName,int nTimeOut)本函數用於啟動心跳計數。需要在被防護程式啟動時調用。一般可以在OnInitInstance函數中。第一個參數為被防護程式的全路徑,可以用GetModuleFileName函數擷取,第二個參數為逾時時間,即多長時間被防護程式沒有計數即認為異常,單位為秒。終止心跳函數:StopHeartBeat()
本函數用於正常終止被防護程式,可在OnExitInstance函數中調用。正常終止時,同時會終止心跳恢複進程。