Windows核心之進程的終止和子進程

來源:互聯網
上載者:User

標籤:bool   single   ide   span   完成   也會   body   statistic   關聯   

1 進程終止的方法:

<1>主線程的進入點函數返回(最好使用這種方法)

<2>進程中的一個線程調用ExitProcesss函數(應該避免使用這樣的方法)。 

<3>還有一個進程中的線程調用TerminateProcess函數(應該避免使用這樣的方法)。 

<4>進程中的全部線程自行終止執行(這樣的情況差點兒從未發生)。

 

 

1.1  主線程進入點函數返回

       始終都應該這樣來設計應用程式。即僅僅有當主線程的進入點函數返回時,它的進程才終止執行。這是保證全部線程資源可以得到正確清除的唯一辦法。

<1>  C++對象將可以使用它們的解構函式得以釋放

<2> 作業系統可以正確的釋放該線程使用的堆棧記憶體

<3> 系統將進程的結束代碼設定為進入點函數的返回值

<4> 系統將核心對象的計數值減去1

1.2 調用ExitProcess函數

         voidExitProcess(uExitCode)

跟主線程的進入點函數返回相比,它就不那麼安全,不能保證資源被清理。

通過調用ExitProcess函數。C++/C執行期啟動代碼可以確保主線程從它的進入點函數返回時,進程便終止執行,而無論進程中是否還有其它線程在執行。

         假設在進入點函數中調用ExitThread。那麼主線程就會停止執行,可是假設進程中假設還有其它線程的話。進程便不會終止。

         ExitProcess以及ExitThread能保證作業系統資源在函數調用時被清除,可是不能保證C/C++執行時資源被正確的清除。所以不妨不要調用這些資源。

         在前面也介紹過當主線程的進入點函數返回的時候。C/C++執行時會調用執行時的exit函數。exit函數會完畢以下操作

<1>調用_onexit函數的調用而注冊的人不論什麼函數

<2>為全部的全域和靜態C++對象調用解構函式

<3>調用系統的ExitProcess函數。將nMainRetVal傳遞給它。

使得作業系統可以撤銷進程並設定它的exit代碼。

1.3 調用TerminateProcess 函數

    BOOL TerminateProcess(HANDLE hProcess,UINTnExitCode)

這個函數通知進程內全部線程終止。當全部線程終止時。進程也會終止了,可是它不會告訴進程內相關聯的DLL這個進程將要被終止。它做的事情:

<1>全部開啟的控制代碼被關閉

<2>全部的線程會被終止

<3>進程對象的狀態變為終止的,滿足全部等待進程結束的線程

<4>進程中全部線程對象的狀態變為終止。滿足全部等待線程結束的線程

<5>進程的終止狀態由STILL_ACTIVE變為了進程的傳回碼

    這個函數是非同步。它告訴作業系統,你要終止某個進程。可是當函數返回的時候,你無法保證進程是否已經被殺死。假設想要確切知道進程是否被殺死,能夠使用WaitForSingleObject函數。

 

2   進程終止時的情況

<1>進程中全部剩餘線程將被終止

<2>進程中指定的使用者物件,GDI對象被釋放。核心對象被關閉

<3>核心對象的狀態編程收到通知的狀態

<4>進程的結束代碼由STILL_ACTIVE 變為ExitProcess或者TerminateProcess傳遞的的結束代碼

<5>進程核心對象計數減去1

能夠通過函數 BOOLGetExitCodeProcess(HANDLE handle,LPDWORD lpExitCode)來尋找進程的結束代碼。假設代碼是STILL_ACTIVE表示的是進程還沒終止。假設不是這個,就說明進程已經被終止。

 

3   子進程

    程式中要實現一段功能一共同擁有3種方法:

<1>調用函數

<2>開闢新線程

<3>開闢新進程

3.1 調用函數

         調用函數時很常見的。可是它的缺點是由於在同一個線程中,所以必須等待此函數運行完成,才幹運行後面的代碼

3.2 開闢新線程

         這樣可以在新線程啟動並執行時候,同一時候運行其它線程的代碼,可是這種缺點是不同線程之間須要交流資料時候。會產生同步的問題。

3.3 開闢子進程

         這樣有點是既能夠保護資料。能夠同步運行,也能夠等待新進程運行完成再去運行其它進程的代碼。缺點是開闢新進程,會造成地址空間的浪費。

Windows核心之進程的終止和子進程

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.