PoEdu - Windows階段班 【Po學校】Lesson05 - 進程 -終止進程的正確方式 & 使用計數
- 4種狀況下終止進程
- 1入口函數返回 (正常的線上方式)
- 入口函數在返回時,確保如下幾件事情已經完成:
- a.主線程所建立的任何對象都已經被正確的銷燬
- b.操做系統會正確的釋放線程的堆棧
- c.將進程的取出代碼設置成入口函數的返回值
- d.遞減內核對象的使用計數
- 2本進程當中任意一個線程調用ExitProcess (非正常終止,強制結束進程,高風險)
- 不該調用此函數來結束進程,當函數被調用 的時候,會結束進程,並將代碼設置爲uExtiCode.但純種並未正確對事,會致使純種沒法正確被清理。
- 3另一個進程中的線程遠程調用TermitateProcess (非正常終止,高風險)
- 不該該用此函數來結束進程,此函數可以結束其餘進程。異步函數。
- 4進程的全部線程都天然死亡,這種狀況不多見,只在理論中存在。
- 使用計數
- 建立一個進程後,會隨之打開了兩個內核對象,一個進程,一個主線程;
- 先看「進程內核對象」的使用計數:CreateProcess函數實際上要設置進程內核對象的使用計數爲2
- CreateProcess會把進程內核對象計數設置爲1,在入口函數返回時,會把進程內核對象計數減1;此時進程內核對象計數爲0,能夠說是徹底消亡了。但這是理論上的邏輯,坑點在實際中:CreateProcess函數會在PROCESS_INFORMATION這個結構體中,使用第2次進程內核對象,由於這個結構體中,填充了進程內核句柄。
- 退出代碼:入口函數在返回退出時,把進程內核對象的使用計數減1,由2次變1次,此時當前PROCESS_INFORMATION結構體會保留退出代碼,以方便父進程取用。
- 正確的銷燬一個進程,讓系統回收之,須要關閉PROCESS_INFORMATION裏面填充使用過的:HANDLE hProcess。
- CloseHandle(PROCESS_INFORATION.hProcess);的意義在於,把使用計數清零。
- 內核泄露只能經過重啓操做系統來實現。因此其危害是嚴重的。
歡迎關注本站公眾號,獲取更多信息