標籤:body div ++ intern 設定 AC 其他 min 檔案
1.進程可以通過以下四種方式終止:
- 主線程的進入點函數返回(強烈推薦的方式)
- 進程中的一個線程調用ExitProcess函數(避免這種方式)
- 另一個進程中的線程調用TerminateProcess函數(避免這種方式)
- 進程中的所有線程都“自然死亡”(這種情況幾乎從來都不會發生)
2.應該保證只有在主線程的進入點函數返回之後,這個應用程式的進程才終止,只有這樣才能保證主線程的所有資源都被正確清理。讓主線程的進入點函數返回,可以保證以下操作會被執行:
- 該線程建立的任何C++對象都將由這些對象的解構函式正確銷毀。
- 作業系統將正確釋放線程棧使用的記憶體。
- 系統將線程的結束代碼(在進程核心對象中維護)設為進入點函數的傳回值。
- 系統遞減進程核心對象的使用計數。
3.ExitProcess函數將終止進程,並設定結束代碼,沒有傳回值,而且之後的代碼永遠不會被執行(對象的解構函式也無法被調用)。
4.當主線程的進入點函數(WinMain,main)返回時,會返回到C/C++運行庫的啟動代碼,後者將正確清理進程使用的全部C運行時資源。釋放了C運行時資源之後,C運行時啟動代碼將顯示調用ExitProcess,並將進入點函數返回的值傳給它。這便解釋了為什麼只需從主線程的進入點函數返回,就會終止整個進程。注意,進程中啟動並執行其他任何線程都會隨進程一起終止。
5.從作業系統的角度出發,一個進程在其所有線程都終止之後才會終止時正確的。但是C/C++運行庫的策略是:不管進程中是否還有其他線程在運行,只要主線程從它的進入點函數返回,C/C++庫就會調用ExitProcess來終止進程。但是如果進入點函數中調用的是ExitThread而不是ExitProcess或進入點函數直接返回,應用程式的主線程將停止執行,但只要進程中還有其他線程在運行,進程就不會終止。
6.任何線程都可以調用TerminateProcess來終止另一個進程或者它自己的進程。只有在無法通過其他方法來強制進程退出時才用。而且被終止的進程得不到自己要被終止的通知,也不能阻止自己被強行終止。
7.一旦進程終止,不管是如何終止的,系統會保證不留它的任何部分。絕對沒有任何辦法知道哪個進程是否運行過。進程在終止後絕對不會泄漏任何東西(記憶體會釋放,檔案會被關閉,核心對象計數會遞減)。
8.TerminateProcess函數是非同步,函數返回時系統並不能保證進程已經被強行終止了。
9.如果一個進程中的所有線程都終止了(它們都調用了ExitThread或TerminateThread來終止了),作業系統就認為沒有任何理由再保持進程的地址空間,就會終止這個進程,進程的結束代碼會被設為最後一個終止的那個線程的結束代碼。
10.一個進程終止時,系統會依次執行以下操作:
- 終止進程中遺留的任何線程
- 釋放進程分配的所有使用者物件和GDI對象,關閉所有核心對象(除非其他進程也開啟了)
- 進程的結束代碼從STILL_ACTIVE變為傳遞給ExitProcess或TerminateProcess函數的代碼。
- 進程核心對象的狀態變成已觸發狀態,這就是為什麼系統中的其他線程可以掛起它們自己,直至另一個進程終止運行。
- 進程核心對象的使用計數遞減1。
Windows Internals 筆記——終止進程