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);的意義在於,把使用計數清零。
    • 內核泄露只能經過重啓操做系統來實現。因此其危害是嚴重的。
相關文章
相關標籤/搜索