在前兩章中我們了解了創建進程,這一章我們來了解下,在linux下如何結束進程。
在linux中,有3種正常結束進程的方式和2種異常中止的方式:
1、正常結束:
a、在main函數中呼叫return。這個相當於呼叫exit。
b、呼叫exit函數,依這個函數在ANSIC的定義,呼叫時將執行所有註冊過的exit句柄,關掉所有的標準I/O流,而且不處理檔案描述子、多進程(父進程與子行程)、作業等,因此對linux系統而言並不健全。
c、呼叫_exit函數。 exit被_exit呼叫linux培訓,關掉一些linux特有的退出句柄。
2、異常中止
a、呼叫abort。這個似乎是第二種情形的特例,由於它形成一個SIGABRT訊號。
b、程式收到特定訊號,這個訊號可以是流程自己形成的(如abort函數),也可以來自其他行程或核心。諸如:程序試圖存取越界的顯存位址或則除數為零時linux模擬,核心就會形成訊號中斷程序。
不管用何種方法結束進程,最終都要執行核心的同一段程式碼。這段程式碼關掉該行程開啟的所有檔案描述符,私訪佔用的顯存等。
接出來我們來了解下exit和_exit函數
這兩個函數在不同的頭檔:exit在stdlib.h中,_exit在unistd.h中
她們的具體調用方式如下:
voidexit(int__status)
void_exit(int__status)
參數status為退出的狀態。
我們來看看下邊這兩段程式碼:
圖1
圖2
圖3
圖4
圖1的程式碼缺乏了n造成了沒有影印出測試結束的句子,這是由於printf若果不加n,則資訊是不會立即複印下來的,而_exit不會強制輸出緩衝區中的數據,即透過printf/fprintf這類呼叫形成的仍未寫入裝置仍在緩衝中的資料就會遺棄,_exit時複印訊息會遺失,而exit不會。假如有n,則直接影印下來,此時exit/_exit無差別
兄妹進程中止的先後次序不同會形成不同的結果
1.父進程先於子進程中止:
此種情況就是我們所說的孤兒進程。當父行程先退出時,系統會讓init行程接管子程序。
2.子行程先於父行程中止,而父行程又沒有呼叫wait函式
此種情況子進程步入僵死狀態,而且會始終保持下去直至系統重啟。子進程處於僵死狀態時linux下退出不保存,核心只保存進程的一些必要資訊以備父進程所需。此時子進程仍佔有資源,同時也降低了系統可以創造的最大進程數。
哪些是僵死狀態呢?
一個早已中止、但是其父進程仍未對其進行善後處理(獲取中止子進程的有關信息,釋放它仍佔有的資源)的進程被稱為僵死進程(zombie)。
3.子進程先於父進程中止linux下退出不保存,而父進程調用了wait函數
此時父進程會等待子進程結束。
以上是Linux 下結束進程的方法:正常與異常終止詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!