希望讀者閱讀此文後,對進程異常退出問題有更深層的認識,有更系統的梳理,對調試此類進程崩潰問題時也能有所説明,寫出更穩定、更可靠的軟體。
進程異常退出
進程退出意味著進程生命期的結束,系統資源被回收,進程從作業系統環境中銷毀。 進程異常退出是進程在運行過程中被意外終止,從而導致進程本來應該繼續執行的任務無法完成。
進程異常退出可能給軟體使用者造成如下負面影響:
軟體喪失部分或者全部功能性,無法完成既定任務。 如果進程正在處理資料,可能造成資料損壞。 如果是關鍵軟體服務,必然導致服務異常中止 , 造成無法預計的損失。 進程異常退出或者進程崩潰 , 也會給軟體使用者造成恐慌和困惑。
進程異常退出是生產環境中經常遇到的問題,它會給軟體使用者造成很多負面影響,所以HTTP://www.aliyun.com/zixun/aggregation/6434.html">軟體發展者應當避免這種問題的出現。 但是導致進程異常退出的場景和原因是多種多樣的,甚至令人琢磨不透。
本文將所有可能造成進程異常退出的原因歸結為兩類。 系統地將其分類,使讀者對此類問題能有清晰的認識。 對每類情況詳細論述,分析根本原因,然後分析了這兩類情況之間的聯繫,也就是信號與進程異常退出的緊密關係。 希望您讀完此文後,能對此類問題有更加全面、深入的理解,對調試此類問題也能有所説明,寫出更加可靠、更加穩定性、更加健壯的軟體。
首先我們來看導致進程異常退出的這兩類情況:
第一類:向進程發送信號導致進程異常退出; 第二類:代碼錯誤導致進程運行時異常退出。
第一類:向進程發送信號導致進程異常退出
信號:
UNIX 系統中的信號是系統回應某些狀況而產生的事件,是進程間通信的一種方式。 信號可以由一個進程發送給另外進程,也可以由核發送給進程。
信號處理常式:
信號處理常式是進程在接收到信號後,系統對信號的回應。 根據具體信號的涵義,相應的預設信號處理常式會採取不同的信號處理方式:
終止進程運行,並且產生 core dump 檔。 終止進程運行。 忽略信號,進程繼續執行。 暫停進程運行。 如果進程已被暫停,重新調度進程繼續執行。
前兩種方式會導致進程異常退出,是本文討論的範圍。 實際上,大多數預設信號處理常式都會終止進程的運行。
在進程接收到信號後,如果進程已經綁定自訂的信號處理常式,進程會在使用者態執行自訂的信號處理常式;反之,內核會執行預設信號程式終止進程運行,導致進程異常退出。
圖 1. 預設信號處理常式終止進程運行
所以,通過向進程發送信號可以觸發預設信號處理常式,預設信號處理常式終止進程運行。 在 UNIX 環境中11545.html">我們有三種方式將信號發送給目標進程,導致進程異常退出。