windows程序銷毀有基本的四種模式,入口函式返回,exitprocess(),termitateprocess(),所有執行緒死亡
這四種操作 只有入口函式返回是靠譜的正規操作,exitprocess(),termitateprocess()是危險操作,盡量避免,所有執行緒死亡的操作只存在於理論上。。。。。
接下來逐個簡述這四種操作。
入口函式返回->程式執行完後自動退出,程式退出的時候會做以下的事:
1.將棧上面的資料全部清除。
2.將堆上面的資料全部清除。
3.設定退出**。(將退出**設定為入口函式的返回值)
4.核心物件的計數減一。
exitprocess(uint uexitcode):
這個函式可以中斷程序操作,立即切斷執行緒,讓程序退出(程序中沒有執行緒的時候就沒有存在的意義,就退出了)。程序推出的時候這個函式會將他的接受到的引數設定為退出**。但是,不會將核心物件的數量遞減。關於核心物件不消亡所產生的影響後面來說。
exitprocess(handle hprocess,dword uexitcode)
這個函式的作用和樓上的函式差不多,但是它多了個handle引數,這個handle引數可以接收乙個控制代碼,可以銷毀特定的程序。
執行緒全部自然死亡:
這個是理論上的,這裡就不說了。。。。。。
接下來說下非常重要的乙個東西->核心物件計數。。。。。。。
樓上為什麼都不推薦使用這些函式在中途退出程序了,就是因為這些函式都不會將核心物件的數量遞減。程式結束,程序核心物件不歸零就會在作業系統中殘留核心物件,而作業系統中的核心物件都是共享的,你的程式用完,系統**,在給別的程式用。如果無法將核心物件**,作業系統的核心物件就越來越少。然後就。。。卡出翔~!!!!!!!!!!
所以,在使用程序的時候還有乙個特別注意的地方,那就是當我們createprocess的時候,核心計數會+1,當我們初始化
typedef struct _process_information
的時候,會在次讓核心物件計數再次+1,這樣來看,其實在初始化createprocess的時候,其實核心計數是+2的,並非表面上的+1,所以在實際運用中,如果乙個程序不需要的時候就要馬上呼叫一次closehandle將核心計數減一,這樣在程式正常返回退出的時候才能做到將核心物件的計數歸0,系統才能**核心物件,才不會導致記憶體核心物件的洩漏。
程序的銷毀
並不是所有的程序結束後都會進入exit zombie,如果乙個程序結束的狀態碼 exit signal 是 1,那麼它結束後將會釋放所有占有的資源,並將狀態改為exit dead 當這個程序沒有被其它程序trace的情 況下,如果被其它程序trace,那麼將傳送乙個訊號給trace它的程序 如果乙個...
04程序的建立和銷毀
通過fork 建立程序,通過返回的的pid進行區別父子程序,系統會拷貝父程序的堆疊到子程序中。getpid 獲取程序id getppid 獲取父程序id 通過exit exit 這兩個函式去結束程序,還有執行到函式最後一行,return 結束程序。狀態標誌位 exit success exit fa...
windows程序監控
最近開發乙個程序監控的服務,由於對windows api不熟,所以折騰了小兩周才完全跑通,特記錄一下 1由於需求需要根據程序名來進行監控,所以首先要根據程序名來獲取程序控制代碼 同名程序可能有多個,比如,起了多個notepad.exe 通過程序名獲取程序控制代碼集 返回值為 同名程序個數 不超過20...