專利名稱:計算機應(yīng)用軟件自糾錯自重起方法
技術(shù)領(lǐng)域:
本發(fā)明屬于涉及一種計算機軟件控制技術(shù)領(lǐng)域,具體地說是一種計算機應(yīng)用軟件自糾錯自重起方法。
背景技術(shù):
目前,應(yīng)用軟件很難避免不出現(xiàn)缺陷,而缺陷的出現(xiàn),常常使程序不可預(yù)測地退出或無響應(yīng)。遇此情況,一般的操作系統(tǒng)通常只能先關(guān)閉無響應(yīng)的運行程序后再重新啟動它。在現(xiàn)有技術(shù)中,視窗2000中操作系統(tǒng)常用Ctrl-Alt-Delete鍵激活任務(wù)管理器來對無響應(yīng)的程序進行終止,然后再重新運行。這對于一般應(yīng)用來說并不存在太大的問題,最多只是對用戶不是很友好而已。但對于某些特殊的應(yīng)用場合,比如不能太長時間中斷的監(jiān)控應(yīng)用、不能由用戶進行干涉的嵌入式系統(tǒng),程序的出錯影響就比較大了,因為這無法通過用戶干預(yù)來處理出錯程序。對于程序出錯,目前技術(shù)上主要采用出錯處理機制的方式,即在程序里監(jiān)控應(yīng)用中可能發(fā)生的代碼,使其發(fā)生異常出錯時能進入設(shè)計者預(yù)先設(shè)計的流程中。在C語言中,常見的錯誤處理是對可能出錯的語句進行返回值判斷。在C++語言中則引入了異常破獲機制,如Try-throw-catch結(jié)構(gòu)就是典型的異常破獲機制。但是這些方法的不足之處在于,每個出錯的地方都應(yīng)該是程序員所知道并進行防范的地方,而再完善的考慮,也不可能預(yù)測、防范和控制所有的出錯情況。
發(fā)明內(nèi)容
有鑒于此,本發(fā)明的目的是提供一種計算機應(yīng)用軟件自糾錯自重起方法,它可使應(yīng)用程序在不可預(yù)測情況出錯退出或無響應(yīng)時,能自動關(guān)閉已錯進程并重新開啟新的進程副本,保證系統(tǒng)長時間正常運行。
為完成上述目的,本發(fā)明采取的技術(shù)方案為一種計算機應(yīng)用軟件自糾錯自重起方法,包括創(chuàng)建一個外部進程,系統(tǒng)啟動時,外部進程先啟動,并由外部進程來創(chuàng)建和啟動應(yīng)用軟件程序的內(nèi)部進程,外部進程定期地對內(nèi)部進程發(fā)送狀態(tài)報告請求,在內(nèi)部進程運行正常的情況下,內(nèi)部進程對外部進程所發(fā)送的狀態(tài)報告請求做出正確和及時的反饋,當內(nèi)部進程出現(xiàn)非正常退出或停止響應(yīng)時,如果外部進程在一段時間內(nèi)一直收不到反饋消息,則外部進程對內(nèi)部進程發(fā)送終止消息或殺掉內(nèi)部進程,并自動建立一新的內(nèi)部進程的步驟。
內(nèi)部進程完成應(yīng)用軟件程序的主要功能和任務(wù)。
外部進程負責(zé)監(jiān)控內(nèi)部進程的運行;外部進程包括通訊和錯誤判斷糾錯機制;通訊機制負責(zé)向內(nèi)部進程發(fā)送請求和接收反饋,它通過消息傳遞方式實現(xiàn)內(nèi)部進程和外部進程之間的消息傳遞;錯誤判斷糾錯機制負責(zé)對通訊接收到的內(nèi)部進程反饋的消息進行分析處理。
錯誤判斷糾錯機制進一步包括判斷是否能按時收到內(nèi)部進程發(fā)來的反饋消息,如果長時間得不到內(nèi)部進程發(fā)來的反饋消息,則檢查內(nèi)部進程是否還存在,如果內(nèi)部進程仍然存在,則認為內(nèi)部進程出現(xiàn)了死鎖,于是便發(fā)出終止消息殺掉內(nèi)部進程,再重新啟動一個內(nèi)部進程,如果內(nèi)部進程已經(jīng)不存在,則直接重新啟動一個內(nèi)部進程的步驟。
內(nèi)部進程內(nèi)部設(shè)有定時器,以判斷應(yīng)用程序內(nèi)部進程的響應(yīng);外部進程定期對內(nèi)部進程發(fā)送的狀態(tài)報告請求是每隔一定時間(如1到5秒鐘)向內(nèi)部進程發(fā)的狀態(tài)詢問信號;外部進程內(nèi)部有一個響應(yīng)標志,它判斷內(nèi)部進程的錯誤累計數(shù)值,外部進程發(fā)一次狀態(tài)詢問信號,該響應(yīng)標志的值就增加1。
定時器進一步包括向內(nèi)部進程發(fā)狀態(tài)報告請求信號,如果內(nèi)部進程錯誤累計數(shù)達到一定值時,則認為內(nèi)部進程死鎖,于是使外部進程的響應(yīng)標志錯誤累計數(shù)值加1的步驟;在內(nèi)部進程運行正常的情況下,內(nèi)部進程對外部進程所發(fā)送的狀態(tài)報告請求做出正確和及時的反饋,將外部進程響應(yīng)標志的錯誤累計數(shù)值清零;糾錯機制進一步包括如果外部進程響應(yīng)標志錯誤累計數(shù)值超過一定的閾值,則啟動一個新的應(yīng)用程序內(nèi)部進程,如果內(nèi)部進程錯誤累計數(shù)值小于一定的閾值但超過一定的數(shù)值時,則讓應(yīng)用程序自己關(guān)閉,如果應(yīng)用程序無法自動關(guān)閉,則強制將其殺掉,再啟動一個新的應(yīng)用程序內(nèi)部進程的步驟;糾錯機制還包括將內(nèi)部進程錯誤累計數(shù)值增加一個較大的數(shù)以迅速重新啟動一個新的內(nèi)部進程步驟。
在本發(fā)明方法中,因為外部進程不做其他復(fù)雜的工作,所以它在設(shè)計和運行中一般不會出現(xiàn)問題,而內(nèi)部的問題又及時地被外部進程所解決處理,這樣,在很大程度上解決了程序的不正常、不確定錯誤的處理,可使應(yīng)用程序能更健壯地長時間工作和運行。
圖1是本發(fā)明的系統(tǒng)示意圖;圖2是本發(fā)明的啟動流程圖;圖3是本發(fā)明的系統(tǒng)正常運行流程圖;圖4是本發(fā)明內(nèi)部進程崩潰時處理流程圖。
具體實施例方式
下面結(jié)合附圖和具體實施方式
對本發(fā)明作進一步詳細的說明。
在嵌入式媒體播放系統(tǒng)中,隨著系統(tǒng)媒體播放軟件功能的強大,多種媒體格式都必須兼容,而錯誤的媒體信息和不正確的用戶操作,很難避免程序不出現(xiàn)不接受用戶響應(yīng)或程序非正常退出的情況。由于嵌入式的設(shè)計,用戶不可能重新關(guān)閉錯誤程序重新運行。
請參閱圖1,本發(fā)明實施例的嵌入式媒體播放系統(tǒng)有一個外部進程,系統(tǒng)啟動后,首先啟動外部進程,由此外部進程來啟動內(nèi)部進程。外部進程向內(nèi)部進程發(fā)狀態(tài)報告請求,內(nèi)部進程查詢自身狀態(tài),并向外部進程反饋自身狀態(tài)。
參閱圖2,本發(fā)明實施例使用可免費使用的多用戶操作系統(tǒng)中的信號機制即消息傳遞方式進行進程間通訊,來完成狀態(tài)報告。首先創(chuàng)建一個外部監(jiān)控進程,當系統(tǒng)啟動時,該外部進程先啟動,并由外部進程來創(chuàng)建和啟動應(yīng)用軟件程序的內(nèi)部進程,內(nèi)部進程完成應(yīng)用軟件程序的主要功能和任務(wù),外部進程負責(zé)監(jiān)控內(nèi)部進程的運行。外部進程包括通訊和錯誤判斷糾錯機制,通訊機制負責(zé)向內(nèi)部進程發(fā)送請求和接收反饋,它通過消息傳遞方式實現(xiàn)內(nèi)部進程和外部進程之間的消息傳遞,錯誤判斷糾錯機制負責(zé)對通訊接收到的內(nèi)部進程反饋的消息進行分析處理。內(nèi)部進程內(nèi)設(shè)有定時器,以判斷應(yīng)用程序內(nèi)部進程的響應(yīng),外部進程定期(如每隔1到5秒鐘或每隔2秒鐘)向內(nèi)部進程發(fā)狀態(tài)詢問信號,外部進程內(nèi)部有一個響應(yīng)標志,它判斷內(nèi)部進程的錯誤累計數(shù)值,外部進程每發(fā)一次狀態(tài)詢問信號,該響應(yīng)標志的值就增加1。內(nèi)部進程收到外部進程發(fā)出的狀態(tài)詢問信號后,向外部進程發(fā)出一個反饋消息,外部進程收到該反饋消息后,就將響應(yīng)標志的錯誤累計數(shù)值清零。為迅速重新啟動一個新的內(nèi)部進程,本發(fā)明設(shè)計內(nèi)部進程錯誤累計數(shù)值一次增加一個較大的數(shù)如30。本發(fā)明的定時器Timer的處理函數(shù)如下
<pre listing-type="program-listing"> static void sig_alarm() { char szCmdStr[50]; if(childpid>0) { errno=0; kill(childpid,SIGUSR1); ∥向應(yīng)用程序內(nèi)部進程發(fā)監(jiān)測消息,本發(fā)明通過發(fā)送信號SIGUSR1進行狀態(tài)詢問。 if(errno==ESRCH);∥如果應(yīng)用程序的進程號已經(jīng)不存在,即監(jiān)測消息根本無接受進程 { nImAlive=30; ∥將錯誤累計數(shù)值增加30,為了迅速地重新啟動一個新進程,本發(fā)明用nImAlive值的大小進行判斷是否重新開啟 } alarm(1);}nImAlive++; ∥發(fā)出的信號數(shù)+1。alarm(1);}接收應(yīng)用程序內(nèi)部進程反饋信息的消息處理函數(shù)如下static void sig_usr(int signumber){ nImAlive=0; ∥將nImAlive清零}∥應(yīng)用程序內(nèi)部進程狀態(tài)并沒有太多的反饋,在其收到外部進程所發(fā)探測信號后進行nImAlive清零</pre>內(nèi)部進程內(nèi)設(shè)有定時器,以判斷應(yīng)用程序內(nèi)部進程的響應(yīng),定時器是一段程序性方法,它包括向內(nèi)部進程發(fā)狀態(tài)報告請求信號,如果內(nèi)部進程錯誤累計數(shù)達到一定值如10到40,本發(fā)明實施例用25時,則認為內(nèi)部進程死鎖,于是使外部進程的響應(yīng)標志錯誤累計數(shù)值加1。外部監(jiān)控進程定期地對內(nèi)部進程發(fā)送狀態(tài)報告請求,在內(nèi)部進程運行正常的情況下,內(nèi)部進程對外部進程所發(fā)送的狀態(tài)報告請求將會做出正確和及時的反饋,當內(nèi)部進程出現(xiàn)非正常退出或停止響應(yīng)時,如果外部進程在一段時間內(nèi)一直收不到反饋消息,則外部進程對內(nèi)部進程發(fā)送終止消息,或殺掉內(nèi)部進程,并自動建立一新的內(nèi)部進程。
參閱圖3,內(nèi)部進程負責(zé)實際的媒體播放操作。外部進程每隔1秒鐘用終止消息命令即殺函數(shù)向內(nèi)部進程發(fā)一個信號,外部進程內(nèi)部有一個響應(yīng)標志,它為全局變量,這個變量的初值是0,外部進程每向內(nèi)部進程發(fā)一次信號,這個變量的值就增加1。內(nèi)部進程收到外部進程發(fā)出的信號后,也用殺函數(shù)向外部進程發(fā)出一個反饋消息,外部進程收到這個反饋消息后,就將全局變量的值清零。
如果內(nèi)部進程發(fā)生了死鎖即內(nèi)部進程崩潰時,則外部進程向其發(fā)出的信號就無法得到反饋。如圖4所示,此時,外部進程的響應(yīng)標志的值就會持續(xù)增加,當這個值增加到一定程度如采用的閾值后,就認為內(nèi)部進程已經(jīng)失去響應(yīng),此時,就要將內(nèi)部進程殺掉,并且重新建立一個內(nèi)部進程。如果內(nèi)部進程錯誤累計數(shù)值小于一定的閾值如25但超過一定的數(shù)值如15時,則讓應(yīng)用程序自己關(guān)閉,如果應(yīng)用程序無法自動關(guān)閉,則強制將其殺掉,再啟動一個新的應(yīng)用程序內(nèi)部進程。對內(nèi)部進程死鎖的處理如下<pre listing-type="program-listing"> if(nImAlive>25) { nImAlive=0; start_prog(nCurProg);∥啟動一個新的應(yīng)用程序 continue; } if(nImAlive>15) { nImAlive=0; nMaxTime=0; do{ if(nMaxTime>20) { kill(childpid,SIGKILL);∥嘗試讓應(yīng)用程序自己關(guān)閉 } else { kill(childpid,SIGTERM); ∥如果應(yīng)用程序無法自動關(guān)閉,則強制將其殺掉 } nMaxTime++; usleep(50); }while((nMaxTime<40 )&amp;&amp;( errno!=ESRCH)); ∥system(″xterm″); start_prog(nCurProg); ∥啟動一個新的應(yīng)用程序 continue; }</pre>在每次向內(nèi)部進程發(fā)消息前,外部進程還要檢測一下內(nèi)部進程是否存在,如果進程已經(jīng)不存在了,認為這是由于程序錯誤導(dǎo)致了內(nèi)部進程的退出,按照本發(fā)明的設(shè)計,只要開機,這個進程就應(yīng)該一直存在。在這種情況下,外部進程就重新建立一個內(nèi)部進程。
本發(fā)明對定時器觸發(fā)的正確性進行測量,把它作為一種判斷參數(shù)。在內(nèi)部進程的內(nèi)部的定時器每隔1到5秒如2秒觸發(fā)一次。每次定時器觸發(fā)時,都記錄下觸發(fā)的時間,并把這個時間存儲到一個最后時間的全局變量中。在內(nèi)部進程向外部進程發(fā)送的反饋消息中,就包含這個時間字串。這是因為,在有些死鎖的情況下,雖然程序不能響應(yīng)用戶的操作,但是卻能響應(yīng)外部進程發(fā)來的信號。這樣,對于用戶來講,內(nèi)部進程已經(jīng)失去響應(yīng)了,而對于外部進程來講,內(nèi)部進程卻沒有失去響應(yīng)。當程序?qū)τ脩羰ロ憫?yīng)的時候,它的內(nèi)部的定時器也就不會再被觸發(fā)了。所以,可以通過定時器來判斷程序是否已經(jīng)對用戶失去響應(yīng)。當外部進程收到內(nèi)部進程發(fā)來的信號時,它判斷這個同時發(fā)來的時間字串,如果發(fā)現(xiàn)這個時間距當前時間已經(jīng)很長,比如超過25秒,則認為內(nèi)部進程已經(jīng)對用戶失去響應(yīng),于是,將內(nèi)部進程的進程殺掉,再重建一個內(nèi)部進程。
在此實施例中,本發(fā)明根據(jù)應(yīng)用的特點和出錯統(tǒng)計,簡化了內(nèi)部程序自身狀態(tài)參數(shù),只使用了兩個參數(shù),基本上杜絕了程序出錯后導(dǎo)致用戶無響應(yīng)或程序中斷的問題。在很大程度上解決了應(yīng)用程序不可預(yù)測出錯的問題,具有很大的實用性。
權(quán)利要求
1.一種計算機應(yīng)用軟件自糾錯自重起方法,其特征在于該方法包括以下步驟(1)創(chuàng)建一個外部進程;(2)系統(tǒng)啟動,外部進程先啟動,并由外部進程來創(chuàng)建和啟動應(yīng)用軟件程序的內(nèi)部進程;(3)外部進程定期地對內(nèi)部進程發(fā)送狀態(tài)報告請求,在內(nèi)部進程運行正常的情況下,內(nèi)部進程對外部進程所發(fā)送的狀態(tài)報告請求做出正確和及時的反饋;(4)當內(nèi)部進程出現(xiàn)非正常退出或停止響應(yīng)時,如果外部進程在一段時間內(nèi)一直收不到反饋消息,則外部進程對內(nèi)部進程發(fā)送終止消息或殺掉內(nèi)部進程,并自動建立一新的內(nèi)部進程。
2.根據(jù)權(quán)利要求1所述的計算機應(yīng)用軟件自糾錯自重起方法,其特征在于所說的內(nèi)部進程完成應(yīng)用軟件程序的主要功能和任務(wù)。
3.根據(jù)權(quán)利要求1所述的計算機應(yīng)用軟件自糾錯自重起方法,其特征在于所說的外部進程負責(zé)監(jiān)控內(nèi)部進程的運行。
4.根據(jù)權(quán)利要求1所述的計算機應(yīng)用軟件自糾錯自重起方法,其特征在于所說的外部進程包括通訊和錯誤判斷糾錯機制。
5.根據(jù)權(quán)利要求4所述的計算機應(yīng)用軟件自糾錯自重起方法,其特征在于所說的通訊機制負責(zé)向內(nèi)部進程發(fā)送請求和接收反饋,它通過消息傳遞方式實現(xiàn)內(nèi)部進程和外部進程之間的消息傳遞。
6.根據(jù)權(quán)利要求4所述的計算機應(yīng)用軟件自糾錯自重起方法,其特征在于所說的錯誤判斷糾錯機制負責(zé)對通訊機制接收到的內(nèi)部進程反饋的消息進行分析處理。
7.根據(jù)權(quán)利要求6所述的計算機應(yīng)用軟件自糾錯自重起方法,其特征在于所說的錯誤判斷糾錯機制進一步包括(1)判斷是否能按時收到內(nèi)部進程發(fā)來的反饋消息,如果長時間得不到內(nèi)部進程發(fā)來的反饋消息,則檢查內(nèi)部進程是否還存在;(2)如果內(nèi)部進程仍然存在,則認為內(nèi)部進程出現(xiàn)了死鎖,于是發(fā)出終止消息,殺掉內(nèi)部進程,再重新啟動一個內(nèi)部進程;(3)如果內(nèi)部進程已經(jīng)不存在,則直接重新啟動一個內(nèi)部進程。
8.根據(jù)權(quán)利要求1所述的計算機應(yīng)用軟件自糾錯自重起方法,其特征在于所說的內(nèi)部進程內(nèi)部設(shè)有定時器,用以判斷應(yīng)用程序內(nèi)部進程的響應(yīng)。
9.根據(jù)權(quán)利要求1所述的計算機應(yīng)用軟件自糾錯自重起方法,其特征在于所說的外部進程定期對內(nèi)部進程發(fā)送狀態(tài)報告請求是指每隔一定時間向內(nèi)部進程發(fā)送狀態(tài)詢問信號。
10.根據(jù)權(quán)利要求9所述的計算機應(yīng)用軟件自糾錯自重起方法,其特征在于所說的每隔一定時間是1到5秒鐘。
11.根據(jù)權(quán)利要求1所述的計算機應(yīng)用軟件自糾錯自重起方法,其特征在于所說的外部進程內(nèi)部有一個響應(yīng)標志,它判斷內(nèi)部進程的錯誤累計數(shù)值,外部進程發(fā)一次狀態(tài)詢問信號,該響應(yīng)標志的值就增加1。
12.根據(jù)權(quán)利要求8所述的計算機應(yīng)用軟件自糾錯自重起方法,其特征在于所說的定時器進一步包括以下步驟(1)向內(nèi)部進程發(fā)狀態(tài)報告請求信號;(2)如果內(nèi)部進程錯誤累計數(shù)達到一定值時,則認為內(nèi)部進程死鎖,使外部進程的響應(yīng)標志錯誤累計數(shù)值加1。
13.根據(jù)權(quán)利要求1所述的計算機應(yīng)用軟件自糾錯自重起方法,其特征在于在內(nèi)部進程運行正常的情況下,內(nèi)部進程對外部進程所發(fā)送的狀態(tài)報告請求做出正確和及時的反饋是指將外部進程響應(yīng)標志的錯誤累計數(shù)值清零。
14.根據(jù)權(quán)利要求1所述的計算機應(yīng)用軟件自糾錯自重起方法,其特征在于步驟(4)進一步包括(1)如果外部進程響應(yīng)標志錯誤累計數(shù)值超過一定的閾值,則啟動一個新的應(yīng)用程序內(nèi)部進程;(2)如果內(nèi)部進程錯誤累計數(shù)值小于一定的閾值但超過一定的數(shù)值時,則讓應(yīng)用程序自已關(guān)閉,如果應(yīng)用程序無法自動關(guān)閉,則強制將其殺掉,再啟動一個新的應(yīng)用程序內(nèi)部進程。
15.根據(jù)權(quán)利要求14所述的計算機應(yīng)用軟件自糾錯自重起方法,其特征在于步驟(1)所說的閾值是10-40。
16.根據(jù)權(quán)利要求14所述的計算機應(yīng)用軟件自糾錯自重起方法,其特征在于步驟(2)所說的閾值是25。
17.根據(jù)權(quán)利要求1所述的計算機應(yīng)用軟件自糾錯自重起方法,其特征在于步驟(4)還包括將內(nèi)部進程錯誤累計數(shù)值增加一個較大的數(shù)以迅速重新啟動一個新的內(nèi)部進程的步驟。
全文摘要
本發(fā)明是一種計算機應(yīng)用軟件自糾錯自重起方法。該方法包括創(chuàng)建一個外部監(jiān)控進程、系統(tǒng)啟動、外部進程先啟動、并由外部進程來創(chuàng)建和啟動應(yīng)用軟件程序的內(nèi)部進程,外部監(jiān)控進程定期地對內(nèi)部進程發(fā)送狀態(tài)報告請求,在內(nèi)部進程運行正常的情況下,內(nèi)部進程對外部進程所發(fā)送的狀態(tài)報告請求做出正確和及時的反饋,當內(nèi)部進程出現(xiàn)非正常退出或停止響應(yīng)時,如果外部進程在一段時間內(nèi)一直收不到反饋消息,則外部進程對內(nèi)部進程發(fā)送終止消息,或殺掉內(nèi)部進程,并自動建立一新的內(nèi)部進程的步驟。本發(fā)明可解決現(xiàn)有技術(shù)中程序不可預(yù)測地退出或無響應(yīng)等問題,在應(yīng)用軟件程序內(nèi)部進程出故障時不需要重新啟動系統(tǒng),可為用戶節(jié)省大量時間。
文檔編號G06F11/30GK1506826SQ0310077
公開日2004年6月23日 申請日期2003年1月29日 優(yōu)先權(quán)日2002年12月9日
發(fā)明者趙明, 韓抗, 趙 明 申請人:聯(lián)想(北京)有限公司